Respuestas:
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).
IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
No hay necesidad de ninguna expresión aritmética, solo use fecha pura:
date -d "1970-01-01 UTC $(date +%T)" +%s
brew install coreutilsy reemplazar datecongdate
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
date -d @$seconds