¿Cómo encuentro segundos desde la medianoche?

11

Usando el dateprograma, ¿cómo puedo calcular la cantidad de segundos desde la medianoche?

Cariño
fuente
1
fecha "+ (% H * 60 +% M) * 60 +% S" | bc
groxxda
1
echo $ (($ (fecha '+ (% H * 60 +% M) * 60 +% S')))
groxxda

Respuestas:

14

Para evitar condiciones de carrera, aún asumiendo la fecha GNU:

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

Con zsh, puedes hacerlo internamente:

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

Portablemente, en zonas horarias donde no hay un interruptor de horario de verano, puede hacer:

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

El ${X#0}es despojar 0s principales que en algunos cáscaras como bash, dashy poshcausan problemas con 09(donde la cáscara se queja acerca de que sea un número octal válido).

Stéphane Chazelas
fuente
Muy inteligente y buen uso de eval
Ulrich Dangel
Prefiero usar algo en este sentido:IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
x-yuri
7

No hay necesidad de ninguna expresión aritmética, solo use fecha pura:

date -d "1970-01-01 UTC $(date +%T)" +%s
Ipor Sircer
fuente
Gran respuesta, debería ser la mejor.
Leopoldo Sanczyk
1
En Mac brew install coreutilsy reemplazar datecongdate
Connor McCormick
2

Basado en bash, obtenga la hora actual en milisegundos desde la medianoche , en un sistema GNU, se puede hacer así:

$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
fedorqui
fuente
2
Quiere asegurarse de no hacer eso a las 23:59:59
Stéphane Chazelas
Y para volver a convertir:date -d @$seconds
choroba