Назад | Перейти на главную страницу

Рассчитать дни с 01.01.1970

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

Есть ли способ сделать это с помощью Linux? Дата команда?

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

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

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

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

А быстрая проверка с помощью WolframAlpha показывает, что это правильное значение.

Думаю, это самый простой способ:

expr $(date +%s) / 86400

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

  date +"%s"

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

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

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

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

Мне тоже нужно было решить эту проблему, но я хотел получить одинаковое значение для дня # независимо от времени суток. С подходами, подобными показанным здесь, значение изменится в полночь по всемирному координированному времени, а не в полночь по местному времени. Это, вероятно, кажется меньшей проблемой в ЕС или на восточном побережье США, которые достаточно близки к всемирному координированному времени, чтобы дневное значение не изменилось в середине обычного рабочего дня, но, например, в Калифорнии изменение дня произойдет в 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 ))

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