我希望,在大纪元时间,"下一次出现的下午3点".
这里的例子:http: //www.gnu.org/software/coreutils/manual/html_node/Examples-of-date.html
和手册:http: //www.gnu.org/software/coreutils/manual/html_node/Relative-items-in-date-strings.html#Relative-items-in-date-strings
似乎没有涵盖这种情况.
需要说明的是,如果当前日期是8月20日下午5点,我希望这将在8月21日下午3点返回.如果当前日期是8月20日下午2点,我希望这将返回8月20日下午3点的纪元秒.
我尝试了以下但是它总是在今天下午3点返回:
date -d "15:00:00" +%s
Run Code Online (Sandbox Code Playgroud)
由于我的声誉,无法编辑或评论@paxdiablo答案,所以我会在这里写一下:
首先,它不会起作用.date +%H可以返回以"0"开头的数字.例如,在09:00它将抛出此错误:
bash: [[: 09: value too great for base (error token is "09")
Run Code Online (Sandbox Code Playgroud)
所以不要使用+%H你应该使用+%k或+%_H(这两个是完全相同的)
另一件事是我不建议使用[[ ]]数学.仅仅因为bash已经(( ))为此而且有正常的运算符>=而不是-ge参数.
另外," "如果您不使用变量,请不要使用.使用' '.这样代码就更清晰,更容易理解.
所以,修正版本在这里:
if (( $(date +%_H) >= 15 )); then
date -d 'tomorrow 15:00' +%s
else
date -d '15:00' +%s
fi
Run Code Online (Sandbox Code Playgroud)
这里的版本略有不同.我更喜欢这个,因为以这种方式维护代码更容易.
nextHour=15
dateStr="$nextHour:00"
(( $(date +%_H) >= nextHour )) && dateStr="tomorrow $dateStr"
date -d "$dateStr" +%s
Run Code Online (Sandbox Code Playgroud)
好!如果您不需要确切的时间,这将会起作用.现在,如果你想要准确的工作时间怎么办?喜欢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"
Run Code Online (Sandbox Code Playgroud)
我希望这回答了你的问题.我建议你使用最后一个版本.
PS哦,最后一段代码在使用早期日期的情况下执行一项不需要的操作.这是一个稍微优化的代码:
nextTime='15:27'
secondsEarly=$(date -d "$nextTime" +%s)
(( secondsEarly > $(date +%s) )) && echo "$secondsEarly" || date -d "tomorrow $nextTime" +%s
Run Code Online (Sandbox Code Playgroud)
但如果我是你,我不会使用它,因为以前的代码更具可读性.