将小时数添加到任意未格式化的日期

将小时数添加到任意未格式化的日期

我需要将 84 小时添加到特定的 UTC 起始日期。起始 UTC 日期是当前日期,但起始小时不是。下面的代码运行良好,直到月底无法转换为下个月,或者年底无法转换年份。

#Date variables

export start_year=$(date -u +%Y)
export start_mon=$(date -u +%m)
export start_monc=${start_mon#0} # strip leading 0
export start_day=$(date -u +%d)
export start_dayc=${start_day#0} # strip leading 0
export start_hour=$fhour    # -------THIS IS EITHER 6, 12, 18, or 0

问题就在这里:

export end_hour=$(( ($start_dayc*24+84)%24 ))
export end_day=$(( $start_dayc+((($start_dayc*24)+84)/24) ))
export end_mon=$(date -u +%m -d '((($start_dayc*24)+84)/24) days')
export end_year=$(date -u +%Y)

额外的变量start_monc用于计算,因为前导零会产生问题。结尾部分需要按原样分解。我最后的办法是创建一系列 if 语句来适当更改月份/年份。

有什么建议可以解决我的月份/年份转换问题?

再次感谢您回答我的问题,这个网站上的资源非常丰富。

答案1

如果你的系统有 GNU 日期函数,那么应该可以本地进行算术运算,例如

date --utc --date="12am today + 84 hours"

date --utc --date="18:00 today + 84 hours"

答案2

我会这样做:

add_84_hours() {
    local datestamp=$1
    local start_hour=$2
    local epoch=$(date -ud "$datestamp $start_hour:00" +%s)
    date -ud "@$(( epoch + 84*3600 ))" +"%Y %_m %e %k"
}

让我们看看它返回什么:

$ add_84_hours now 18
2014  2 28  6
$ add_84_hours 2014-02-26 18
2014  3  2  6
$ add_84_hours 2016-02-26 18   # leap year
2016  3  1  6

要将这些值保存到变量:

read end_year end_month end_day end_hour < <(add_84_hours now 18)
printf "%s\n" "$end_year" "$end_month" "$end_day" "$end_hour"
2014
2
28
6

相关内容