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


11

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


Я закончил тем, что делал что-то подобное в 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

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"

Даже 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 

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.