如何使用日期查找下一小时的秒数?我知道我可以做到
date -d "next hour"
但是现在只增加1小时。我想让它显示下一个整整一小时的秒数。例如,如果当前时间为9:39am
,我想找到10am
的秒数
答案 0 :(得分:7)
现在的纪元时间戳是
now=$(date '+%s')
下一个小时是
next=$(date -d $(date -d 'next hour' '+%H:00:00') '+%s')
下一个小时前的秒数
echo $(( next - now ))
对于连续解决方案,请使用函数:
now() { date +%s; }
next() { date -d $(date -d "next ${1- hour}" '+%H:00:00') '+%s'; }
现在你有了
echo $(( $(next) - $(now) ))
甚至
echo $(( $(next day) - $(now) ))
另一种稍微有点算术的方法仍然使用纪元时间戳。我们知道它开始于一个小时,因此时间戳mod 3600在一小时内仅等于零。因此
$(( $(date +%s) % 3600 ))
是自上一小时以来的秒数,
$(( 3600 - $(date +%s) % 3600 ))
是下一次的秒数。
答案 1 :(得分:6)
嗯,总是那种直截了当的方式:
read min sec <<<$(date +'%M %S')
echo $(( 3600 - 10#$min*60 - 10#$sec ))
编辑:删除了竞争条件,添加了显式基数。谢谢,@ irici和@gniourf_gniourf。
答案 2 :(得分:3)
使用Bash≥4.2,您可以使用printf
和%(...)T
修饰符来访问日期(当前日期对应于参数-1
,或者从版本4.3开始为空):
printf -v left '%(3600-60*10#%M-10#%S)T' -1
echo "$((left))"
Pure Bash,没有子弹!
10#
用于确保Bash的算术(在$((...))
中展开)在基数10中处理以下数字。如果没有这个,您将收到错误,如果分钟或秒钟为08
或09
。
答案 3 :(得分:1)
尝试这样做:
LANG=C
now=$(date +%s)
next="$(date |
perl -pe 's/(\d{2}):\d{2}:\d{2}/sprintf "%.2d:00:00", $1 + 1/e')"
next=$(date -d "$next" +%s)
echo $(( next - now ))
输出:
2422