Linux date命令,查找下一小时的秒数

bro*_*oli 10 linux bash date

如何使用日期查找下一小时的秒数?我知道我能做到

date -d "next hour"
Run Code Online (Sandbox Code Playgroud)

但这只是增加1小时到现在.我想让它显示下一个整整一小时的秒数.例如,如果当前时间是9:39am我想要找到的秒数10am

koj*_*iro 8

现在的纪元时间戳是

now=$(date '+%s')
Run Code Online (Sandbox Code Playgroud)

那个下一个小时是

next=$(date -d $(date -d 'next hour' '+%H:00:00') '+%s')
Run Code Online (Sandbox Code Playgroud)

到下一个小时的秒数

echo $(( next - now ))
Run Code Online (Sandbox Code Playgroud)

要获得持续的解决方案,请使用以

now() { date +%s; }
next() { date -d $(date -d "next ${1- hour}" '+%H:00:00') '+%s'; }
Run Code Online (Sandbox Code Playgroud)

现在你有了

echo $(( $(next) - $(now) ))
Run Code Online (Sandbox Code Playgroud)

乃至

echo $(( $(next day) - $(now) ))
Run Code Online (Sandbox Code Playgroud)

其他方式

另一种稍微有点算术的方法仍然使用纪元时间戳.我们知道它开始于一个小时,因此时间戳mod 3600在一小时内仅等于零.从而

$(( $(date +%s) % 3600 ))
Run Code Online (Sandbox Code Playgroud)

是自上一小时以来的秒数

$(( 3600 - $(date +%s) % 3600 ))
Run Code Online (Sandbox Code Playgroud)

是下一个秒的秒数.

  • `date -d'next hour''+%H:00:00'`很不错,+ 1 (2认同)
  • 如果首先获得"next",则系统繁忙时,两个日期解决方案可能会得到否定答案.(例如`next` @ 00:59:59,和`now` @ 01:00:01.) (2认同)

Mar*_*eed 6

好吧,总有一种直截了当的方式:

read min sec <<<$(date +'%M %S')
echo $(( 3600 - 10#$min*60 - 10#$sec ))
Run Code Online (Sandbox Code Playgroud)

编辑:删除竞争条件,添加显式基数.谢谢,@rici和@gniourf_gniourf.

  • 每隔一段时间,秒数会在两次调用 `date` 之间回绕,并且该值将关闭 60 秒。 (2认同)
  • 这是另一种可爱的方式:`declare -i "seconds_left=$(date +"3600 - 60*%M - %S")"` (2认同)
  • @MarkReed 是 `declare -i` 比 `$(())` 多吗?或者这就是你所说的“难以脱身”? (2认同)
  • 你需要`echo $((3600 - 10#$ min*60 - 10#$ sec))`以确保分钟和秒被解释为基数10.没有`10#`,你的命令会失败,如果分钟或者第二个是"08"或"09". (2认同)