使用linux date获取下一次出现的时间

时间:2015-01-02 10:54:04

标签: linux date

Linux date实用程序可以理解很多字符串,例如:

$ date -d '8:30'
Fri Jan  2 08:30:00 CET 2015

我正在寻找获得下一个8:30的方法,因此:

  • 如果Fri Jan 2之前为8:30,则应返回上述结果;
  • 否则应打印Sat Jan 3 08:30:00 CET 2015

正如可以看到next 8:30没有得到正确的答案:

$ date -d 'next 8:30'
date: invalid date ‘next 8:30’

是否有一个表达式来计算它?

在shell中自己处理它当然是一种选择,但由于夏令时规则等使事情变得更加复杂。

如果时钟适应夏令时,next 8:30应根据第二天的设置解析为8:30

测试用例

鉴于它是Fri Jan 2 12:01:01 CET 2015,结果应为:

$ date -d 'next 8:30'
Sat Jan  3 08:30:00 CET 2015

$ date -d 'next 15:30'
Fri Jan  2 15:30:00 CET 2015

2 个答案:

答案 0 :(得分:2)

只需使用:

if [[ $(date -d '8:30 today' +%s) -lt $(date +%s) ]] ; then
    next830="$(date -d '8:30 tomorrow')"
else
    next830="$(date -d '8:30 today')"
fi

%s格式字符串给出了自纪元以来的秒数,因此if语句基本上是:

if 8:30-today is before now:
    use 8:30-tomorrow
else
    use 8:30-today

答案 1 :(得分:1)

我研究过,似乎不可能这样做。

您可以做的是将小时和分钟与830进行比较并相应地打印:

[ $(date '+%H%M') -le 830 ] && date -d '8:30' || date -d '8:30 + 1 day'

如果您想轻松使用此功能,请创建一个函数来执行这些计算。

测试

$ [ $(date '+%H%M') -le 830 ] && date '8:30' || date -d '8:30 + 1 day'
Sat Jan  3 08:30:00 CET 2015