如何查找自午夜以来的秒数?

如何查找自午夜以来的秒数?

使用该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,dashposh导致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') )) ;}

相关内容