Какой умный способ подсчитать количество дней с Х?

11

Я начал работать на своей нынешней должности с 17 ноября 2014 года. Я хотел бы знать, сколько дней прошло до сих пор. Любые идеи о том, как использовать Linux, чтобы придумать простое и приятное решение?

ychaouche
источник
Я закончил тем, что делал что-то подобное в Perl-скрипте; Я использовал функцию timelocal (), чтобы получить количество секунд от эпохи до указанной даты (например, 17 ноября 2014 г.), затем вычел это из текущей даты эпохи в секундах, затем разделил на 86400 (секунд в день). Я уверен, что кто-то придет с решением только для оболочки :)
Джефф Шаллер
2
Временная арифметика имеет множество особых случаев. Хотя простые вещи, такие как вычитание меток времени UNIX и деление на 86 400, дадут вам приблизительный ответ, лучше использовать специализированную библиотеку времени, которая учитывает особые случаи, например, Python dateutil.
Рейд
1
Здесь также могут помочь некоторые ответы в разделе « Быстро рассчитать разницу в датах» .
Манатворк
@ msh210 Вас забанили на пожизненный срок и приговорили к тюремному заключению на 1 месяц, когда вы служите сообществу в качестве очистителя кода для древнего кода COBOL.
10

Ответы:

14
echo $(( (`date +%s` - `date +%s -d '2014/11/17'`) / 86400 )) days ago
wurtel
источник
4
Это делает неправильные секунды прыжка. Я имею в виду, что это вряд ли имеет значение сейчас , но примерно через 10 тысяч лет накопленной ошибки может быть достаточно, чтобы иметь значение.
Кевин
2
Вероятность високосных секунд приведет к ошибке примерно в .000001%. Это ничтожно мало по сравнению с неправильным количеством дней, которые этот метод даст в регионах, где наблюдается переход на летнее время: 2% случаев ...
jlliagre
2
@ Кевин: Если он хочет знать, сколько дней он где-то работал, мы можем (до дальнейшего развития криогенизации или медицины) не слишком беспокоиться об этом ^^
Оливье Дюлак
1
@jlliagre:% s - это время Unix, всегда UTC, в котором отсутствует DST.
Кевин
1
Скорее всего, он будет интересоваться количеством дней, проведенных на работе за его столом. Поскольку это, вероятно, не около полуночи, а где-то между 8 утра и 5 вечера (и date -d 2014/11/17дает отметку времени полуночи, поскольку время не упоминается) DST не имеет значения.
wurtel
5

Ну, на первый взгляд

$ date --date="-239 days"
Mon Nov 17 15:25:40 CET 2014

В сценарии (не очень эффективный, но ... может быть, он обрабатывает дополнительные секунды?;))

i=0
result=""
while [ "$result" != "20141117" ]
do
    i=$((i+1))
    result=$(date --date="-$i days" +%Y%m%d)
done
echo "$i" days have passed since "$result"
frostschutz
источник
Даже agoпонятно:date --date="239 days ago"
Цифровая травма
1
@DigitalTrauma слишком плохо, он не локализован. Например, LC_ALL=ru_RU.utf8 date --date="239 дней назад"дает мне тот же результат, что и date --date="239".
Руслан
@Ruslan действительно :)
Цифровая травма
1

Я попробовал Python в командной строке.

$ python -c "import datetime; print datetime.date.today() - datetime.date(2014,11,17)"
246 days, 0:00:00 
ychaouche
источник
1

Вот пример с PHP:

<?php
$o1 = date_create('2014-11-17');
$o2 = date_create();
$o3 = date_diff($o2, $o1);
echo 'days: ', $o3->days, "\n";

Результат:

days: 1927

https://php.net/function.date-diff

Стивен Пенни
источник