Відповіді:
Щоб уникнути перегонових умов, все ж припускаючи дату GNU:
eval "$(date +'today=%F now=%s')"
midnight=$(date -d "$today 0" +%s)
echo "$((now - midnight))"
З zsh
, ви можете зробити це всередині країни :
zmodload zsh/datetime
now=$EPOCHSECONDS
strftime -s today %F $now
strftime -rs midnight %F $today
echo $((now - midnight))
Портативно, у часових поясах, де немає перемикача літнього часу, ви можете:
IFS=:
set -- $(date +%T)
echo "$((${1#0} * 3600 + ${2#0} * 60 + ${3#0}))"
${X#0}
Є смуга провідних 0s , які в деяких оболонках подобається bash
, dash
і posh
проблеми викликають з 09
(де оболонка скаржиться , що є неприпустимим вісімкове число).
IFS=: read -r today now <<< $(date +%F:%s); midnight=$(date -d "$today 0" +%s); echo $(( now - midnight ))
Ніяких арифметичних виразів не потрібно, просто використовуйте чисту дату:
date -d "1970-01-01 UTC $(date +%T)" +%s
brew install coreutils
і замінити date
наgdate
Виходячи з bash, отримати поточний час в мілісекундах з півночі , в системі GNU, це можна зробити так:
$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
date -d @$seconds