bash - 在 bash 脚本 : next occurrence of 3pm 中使用日期命令

标签 bash date

我想在纪元时间“下一次下午 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

最佳答案

由于我的声誉,无法编辑或评论@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/

相关文章:

bash 如何处理当前时间的小时数

bash - kafka-console-producer : command not found

linux - 一行获取进程的PID

java - 夏令时Java中的当前估计时间

java - 在 API 中使用 java.util.Date 的充分理由

php - 这个奇怪的日期值的时间格式是什么

linux - Apache 日志 grep、awk 或 sed

bash - tail -f、awk 并输出到文件 >

sql - SAS Proc SQL 获取日期最接近特定日期的记录

javascript - 如何检查两个日期数组是否有匹配的项目?