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

时间:2014-12-22 02:07:30

标签: linux bash date

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

date -d "next hour"

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

4 个答案:

答案 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中处理以下数字。如果没有这个,您将收到错误,如果分钟或秒钟为0809

答案 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