Обчисліть дні з 1.01.1970


10

Як можна обчислити кількість днів з 1.01.1970 року? Це для оновлення атрибута shadowLastChange на OpenLDAP.

Чи є спосіб це зробити за допомогою команди linux date ?


У Bash і в більшості сучасних раковин, отриманих в Борні, $()перевага віддається перед задніми мітками з читабельності та інших причин . 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 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 PST, що може бути незручно. Я думаю, австралійцям було б особливо прикро, що пізній ранок змінить значення дня.

Якщо ми хочемо виправити це, нам потрібно додати зміщення від UTC перед діленням на сек / день. На щастя, команда дати Linux включає послідовність формату % z , яка повідомляє про зміщення від UTC. Хоча стандартний формат (цей результат призначений для Денверського часу, MDT):

$ date +%z
-0600

. . . Не підлягає прямому використанню в розрахунку, правильні модифікатори дадуть те, що ми хочемо:

$ date +%-:::z
-6

Поставте це разом із звичайними перетвореннями сек / годин / днів, і я вважаю, що наступні повинні виводити дні з 1.01.1970 року, при цьому сам 1/1/1970 день дорівнює нулю, а значення збільшується опівночі за місцевим часом:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.