Réponses:
Pour éviter les conditions de concurrence, en supposant toujours la date GNU:
eval "$(date +'today=%F now=%s')"
midnight=$(date -d "$today 0" +%s)
echo "$((now - midnight))"
Avec zsh
, vous pouvez le faire en interne:
zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s today %F $now
strftime -rs midnight %F $today
echo $((now - midnight))
De manière portable, dans les fuseaux horaires où il n'y a pas de commutateur d'heure d'été, vous pouvez faire:
IFS=:
set -- $(date +%T)
echo "$((${1#0} * 3600 + ${2#0} * 60 + ${3#0}))"
Le ${X#0}
est de dépouiller premier plan 0s qui , dans certains coquillages aiment bash
, dash
et posh
causer des problèmes avec 09
(où la coquille se plaint à ce sujet étant un nombre octal non valide).
IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
Aucune expression arithmétique n'est nécessaire, utilisez simplement la date pure:
date -d "1970-01-01 UTC $(date +%T)" +%s
brew install coreutils
et remplacer date
pargdate
Basé sur bash, obtenez l'heure actuelle en millisecondes depuis minuit , sur un système GNU, cela peut être fait comme ceci:
$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
date -d @$seconds