Para evitar condições de corrida, ainda assumindo a data do 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))
Portáteis, em fusos horários onde não há opção de horário de verão, você poderia fazer:
IFS=:
set -- $(date +%T)
echo "$((${1#0} * 3600 + ${2#0} * 60 + ${3#0}))"
O ${X#0}
é remover 0s iniciais que, em algumas camadas como bash
, dash
e posh
, causam problemas com 09
(onde a shell reclama que é um número octal inválido).