使用该date
程序,如何计算自午夜以来的秒数?
答案1
为了避免竞争条件,仍然假设 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))
方便地,在没有夏令时开关的时区,您可以这样做:
eval "$(date +'h=%H m=%M s=%S')"
echo "$((${h#0} * 3600 + ${m#0} * 60
+ ${s#0}))"
的作用${X#0}
是去掉一个前导 0,这在某些 shell 中如bash
,dash
并posh
导致08
和出现问题09
(其中 shell 抱怨它是一个无效的八进制数)。
答案2
不需要任何算术表达式,只需使用纯日期:
date -d "1970-01-01 UTC $(date +%T)" +%s
答案3
基于bash,获取自午夜以来的当前时间(以毫秒为单位),在GNU系统上,可以这样完成:
$ now=$(date '+%s')
$ midnight=$(date -d 'today 00:00:00' '+%s')
$ echo $(( now - midnight ))
53983
答案4
从午夜算起已经过了几秒?
对于 Bash(使用 GNU date
),这里有两个同样有效的单行代码:
echo $(( - $(date -d 0 +%s) + EPOCHSECONDS ))
或者
echo $(( $(date '+%-H *3600 + %-M *60 + %-S') ))
任何一种都可以正常工作。
同样,我发现从午夜开始运行几分钟的函数很有用:
minutes () { echo $(( $(date '+%-H *60 + %-M') )) ;}