Який розумний спосіб підрахувати кількість днів після X?


11

Я почав працювати на своїй нинішній посаді з 17 листопада 2014 року. Мені хотілося б знати, скільки днів минуло до цього часу. Будь-які ідеї, як використовувати Linux, щоб придумати просте і приємне рішення?


Я в кінцевому підсумку робив щось подібне за сценарієм perl; Я використовував функцію timelocal (), щоб отримати кількість секунд від епохи до заданої дати (наприклад, 17 листопада 2014 р.), Потім відняв цю функцію від поточної дати-в-секунді епохи, потім розділив на 86400 (секунд у день). Я впевнений, що комусь вдасться вирішити лише рішення про оболонки :)
Джефф Шаллер

2
Арифметика часу має безліч чудо-особливих випадків. У той час як прості речі, такі як віднімання часових позначок UNIX та розділення на 86 400, дадуть приблизну відповідь, вам краще скористатися спеціалізованою бібліотекою часу, яка враховує особливі випадки, наприклад, Python's dateutil.
Рейд

1
Деякі відповіді в розділі Швидке обчислення різниць у даті також можуть допомогти тут.
манатура


@ msh210 вас забороняють довічно і засуджують до в'язниці на 1 місяць під час служіння громаді в якості очищувача коду для давнього коду COBOL.
ychaouche

Відповіді:


14
echo $(( (`date +%s` - `date +%s -d '2014/11/17'`) / 86400 )) days ago

4
Це отримує високосні секунди неправильно. Я маю в виду, що не має особливого значення в даний час , але в 10к років або близько того, накопичена помилка може бути досить , щоб питання.
Кевін

2
Імовірнісні стрибкові секунди спричинить помилку приблизно на .000001%. Це незначно порівняно з неправильною кількістю днів, які цей метод надаватиме місцем, де спостерігається літній час: 2% випадків ...
jlliagre

2
@Kevin: Якщо він хоче знати, скільки днів він десь працював, ми можемо (до подальшого прогресування кріогенізації чи медицини) не надто перейматися цим ^^
Олів'є Дулак

1
@jlliagre:% s - час Unix, який завжди є UTC, якому не вистачає DST.
Кевін

1
Цілком ймовірно, що йому буде цікаво кількість днів, зайнятих під час роботи на холостому ходу за робочим столом. Оскільки це, мабуть, не близько півночі, але десь між 8 ранку та 17 вечора (і 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 дійсно :)
Digital Trauma

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.