Как мне найти секунды с полуночи?

11

Используя dateпрограмму, как я могу рассчитать количество секунд с полуночи?

душка
источник
1
дата "+ (% H * 60 +% M) * 60 +% S" | до н.э.
Groxxda
1
echo $ (($ (дата '+ (% H * 60 +% M) * 60 +% S')))
groxxda

Ответы:

14

Чтобы избежать условий гонки, по-прежнему предполагая дату GNU:

eval "$(date +'today=%F now=%s')"
midnight=$(date -d "$today 0" +%s)
echo "$((now - midnight))"

С помощью zshвы можете сделать это внутри:

zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s today %F $now
strftime -rs midnight %F $today
echo $((now - midnight))

В часовых поясах, где нет перехода на летнее время, вы можете сделать следующее:

IFS=:
set -- $(date +%T)
echo "$((${1#0} * 3600 + ${2#0} * 60 + ${3#0}))"

Он ${X#0}должен убирать начальные 0, которые в некоторых оболочках нравятся bash, dashи poshвызывают проблемы 09(где оболочка жалуется на то, что это недопустимое восьмеричное число).

Стефан Шазелас
источник
Очень умное и полезное использование eval
Ульрих Дангел
Я предпочел бы использовать что-то вроде этого:IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
x-yuri
7

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

date -d "1970-01-01 UTC $(date +%T)" +%s
Ипор Сирсер
источник
Отличный ответ, должен быть лучшим.
Леопольдо Санчик
1
На Mac brew install coreutilsи заменить dateнаgdate
Коннор Маккормик
2

На основе bash, получить текущее время в миллисекундах с полуночи в системе GNU, это можно сделать так:

$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
fedorqui
источник
2
Вы хотите убедиться, что не делаете этого в 23:59:59
Стефан Шазелас
И преобразовать обратно:date -d @$seconds
Чороба