我需要将 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