由于我的声誉,无法编辑或评论@paxdiablo 的答案,所以我会写在这里:
首先,它是行不通的。date+%H
可以返回以“0”开头的数字。例如,在 09:00 它会抛出这个错误:
bash: [[: 09: value too great for base (error token is "09")
所以不要使用+%H
你应该使用+%k
or +%_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"
我希望这回答了你的问题。我建议您使用最后一个变体。
PS哦,最后一段代码在使用早期日期的情况下做了一个不需要的操作。这是一个稍微优化的代码:
nextTime='15:27'
secondsEarly=$(date -d "$nextTime" +%s)
(( secondsEarly > $(date +%s) )) && echo "$secondsEarly" || date -d "tomorrow $nextTime" +%s
但如果我是你,我不会使用它,因为以前的代码更具可读性。