Respostas:
Para evitar condições de corrida, ainda assumindo a data GNU:
eval "$(date +'today=%F now=%s')"
midnight=$(date -d "$today 0" +%s)
echo "$((now - midnight))"
Com zsh
, você pode fazer isso internamente:
zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s today %F $now
strftime -rs midnight %F $today
echo $((now - midnight))
De maneira portável, em fusos horários em que não há opção de horário de verão, você pode:
IFS=:
set -- $(date +%T)
echo "$((${1#0} * 3600 + ${2#0} * 60 + ${3#0}))"
A ${X#0}
é para descascar principais 0s que em alguns escudos como bash
, dash
e posh
causam problemas com 09
(onde o shell reclama sobre ele ser um número octal inválido).
IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
Não há necessidade de expressão aritmética, basta usar data pura:
date -d "1970-01-01 UTC $(date +%T)" +%s
brew install coreutils
e substitua date
porgdate
Com base no bash, obtenha o tempo atual em milissegundos desde a meia-noite , em um sistema GNU, isso pode ser feito da seguinte maneira:
$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
date -d @$seconds