Ответы:
ring0 побил меня на несколько секунд, но полная команда:
echo $(($(date --utc --date "$1" +%s)/86400))
Это идет по времени UTC. Результат:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
Быстрая проверка с WolframAlpha показывает , что это правильное значение.
Я думаю, что это самый простой метод:
expr $(date +%s) / 86400
Мне нужно было решить и это, но я хотел получить одно и то же значение для дня, независимо от времени суток. При подходах, подобных показанным здесь, значение будет меняться в полночь по 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
приведет к ошибке «недопустимый символ в выражении» при использовании в приведенном выше заявлении.
$()
предпочтение перед обратными метками для удобства чтения и других причин .echo $(( $(date ...) / 86400 ))