我想在纪元时间“下一次下午 3 点”。
这里的例子: http://www.gnu.org/software/coreutils/manual/html_node/Examples-of-date.html
似乎没有涵盖这种情况。
需要说明的是,如果当前日期是 8 月 20 日下午 5 点,我希望返回 8 月 21 日下午 3 点的纪元秒。如果当前日期是 8 月 20 日下午 2 点,我希望返回 8 月 20 日下午 3 点的纪元秒。
我尝试了以下方法,但它总是在今天下午 3 点返回:
date -d "15:00:00" +%s
最佳答案
由于我的声誉,无法编辑或评论@paxdiablo 的回答,所以我会写在这里:
首先,它是行不通的。 date +%H
可以返回以“0”开头的数字。例如,在 09:00,它会抛出这个错误:
bash: [[: 09: value too great for base (error token is "09")
因此,您应该使用 +%k
或 +%_H
而不是使用 +%H
(这两个完全相同)
另一件事是,我不建议将 [[ ]]
用于数学。仅仅是因为 bash 有 (( ))
并且有像 >=
这样的普通运算符而不是 -ge
参数。
此外,如果您不使用变量,请不要使用 ""
。使用 ' '
。这样代码会更清晰、更容易理解。
所以,固定版本在这里:
if (( $(date +%_H) >= 15 )); then
date -d 'tomorrow 15:00' +%s
else
date -d '15:00' +%s
fi
这里是略有不同的版本。我更喜欢这个,因为这样更容易维护代码。
nextHour=15
dateStr="$nextHour:00"
(( $(date +%_H) >= nextHour )) && dateStr="tomorrow $dateStr"
date -d "$dateStr" +%s
很好!如果您不需要确切的时间,这将起作用。现在,如果您想使用精确时间怎么办?像 15:27
吗?
方法略有不同:
nextTime='15:27'
secondsEarly=$(date -d "$nextTime" +%s)
secondsLate=$(date -d "tomorrow $nextTime" +%s)
secondsNow=$(date +%s)
(( secondsEarly > secondsNow )) && echo "$secondsEarly" || echo "$secondsLate"
我希望这能回答您的问题。我建议您使用最后一个变体。
附言哦,最后一段代码在使用早期日期的情况下做了一个不需要的操作。这是一个稍微优化的代码:
nextTime='15:27'
secondsEarly=$(date -d "$nextTime" +%s)
(( secondsEarly > $(date +%s) )) && echo "$secondsEarly" || date -d "tomorrow $nextTime" +%s
但如果我是你,我不会使用它,因为以前的代码更具可读性。
关于bash - 在 bash 脚本 : next occurrence of 3pm 中使用日期命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18348126/