Расчет дней с 01.01.1970


10

Как вы можете рассчитать количество дней с 01.01.1970? Это для обновления атрибута shadowLastChange в OpenLDAP.

Есть ли способ сделать это с помощью команды linux date ?


В Bash и большинстве современных оболочек, полученных из Bourne, $()предпочтение перед обратными метками для удобства чтения и других причин . echo $(( $(date ...) / 86400 ))
Приостановлено до дальнейшего уведомления.

Еще нет 2000 ... может кто-нибудь отредактировать и исправить заголовок :-)
Кольцо Ø

Ответы:


20

ring0 побил меня на несколько секунд, но полная команда:

echo $(($(date --utc --date "$1" +%s)/86400))

Это идет по времени UTC. Результат:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

Быстрая проверка с WolframAlpha показывает , что это правильное значение.


1
как насчет високосных секунд? :)
netvope

1
@netvope После дополнительной високосной секунды время unix снова сбрасывается на единицу. Таким образом, каждый день добавляет ровно 86400 секунд Unix. Однако время Unix 915148800 может обозначать UTC 1998-12-31T23: 59: 60 и 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

Команда dateможет дать вам количество секунд с тех пор 1970-01-01 00:00:00 UTC.

  date +"%s"

Вы можете разделить результат 3600*24на количество дней (UTC).

Например, в Баш

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

для отображения количества дней.



1

Мне нужно было решить и это, но я хотел получить одно и то же значение для дня, независимо от времени суток. При подходах, подобных показанным здесь, значение будет меняться в полночь по UTC вместо полуночи по местному времени. Это, вероятно, кажется меньшей проблемой в ЕС или на восточном побережье США, которые достаточно близки к UTC, так что значение дня не изменится в середине типичного рабочего дня, но, например, в Калифорнии, изменение дня произойдет в 16:00 по тихоокеанскому времени, что может быть неудобно. Я предполагаю, что австралийцы были бы особенно раздражены, чтобы иметь изменение дневного значения поздним утром.

Если мы хотим исправить это, нам нужно добавить смещение от UTC до деления на секунды / день. К счастью, команда даты в Linux включает последовательность формата % z , которая сообщает о смещении от UTC. Пока стандартный формат (это результат для денверского времени, MDT):

$ date +%z
-0600

, , , не может быть непосредственно использован в вычислениях, правильные модификаторы будут давать то, что мы хотим:

$ date +%-:::z
-6

Поместите это вместе с обычными конверсиями в секундах / часах / днях, и я полагаю, что следующие должны выводить дни с 01.01.1970, причем сам 01.01.1970 будет нулевым днем, а значение будет увеличиваться в полночь по местному времени:

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

Это простое вычисление не будет работать для часовых поясов, которые не смещены от UTC на целые часы (например, Индия, TZ = Азия / Калькутта), поскольку «+5: 30», полученное с помощью, date +%-:::zприведет к ошибке «недопустимый символ в выражении» при использовании в приведенном выше заявлении.

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