如何计算两个UTC时间的天数差?能否直接相减无需转换?
如何在Shell中计算两个UTC时间的天数差值?
首先直接给结论:不能直接对这两个字符串形式的时间变量做减法运算,Shell只能对数字执行算术操作,所以必须先把UTC时间字符串转换为Unix时间戳(即从1970-01-01 00:00:00 UTC开始的秒数),再进行计算。
另外先纠正你定义START_TIME的小错误:你用反引号包裹了固定时间字符串,这会导致Shell试图把2018-02-26T04:46:20Z当作命令执行,肯定会报错。正确的定义应该是用双引号或者直接赋值:
export START_TIME="2018-02-26T04:46:20Z"
下面是完整的实现步骤和示例脚本:
步骤1:将UTC时间转换为Unix时间戳
GNU date(Linux系统默认)可以直接识别ISO8601格式的UTC时间(比如你的YYYY-MM-DDTHH:MM:SSZ格式),用+%s参数就能输出对应的时间戳:
- 对于当前UTC时间,你可以直接获取时间戳,不用先存成字符串:
如果一定要保留current_timestamp=$(date -u +%s)CURRENT_TIME变量,也可以这样转换:export CURRENT_TIME=$(date -u +%FT%Z) current_timestamp=$(date -d "$CURRENT_TIME" +%s) - 对于固定的
START_TIME,转换方式类似:start_timestamp=$(date -d "$START_TIME" +%s)
步骤2:计算天数差值
时间戳的差值是秒数,我们知道一天有86400秒,用整数除法就能得到天数:
# 计算秒数差值 diff_seconds=$((current_timestamp - start_timestamp)) # 转换为天数(Shell整数除法会自动截断小数部分) diff_days=$((diff_seconds / 86400)) # 如果需要获取绝对值(比如不确定哪个时间更早) abs_diff_days=$((diff_days < 0 ? -diff_days : diff_days))
完整示例脚本
# 正确定义起始UTC时间 export START_TIME="2018-02-26T04:46:20Z" # 获取当前UTC时间戳 current_timestamp=$(date -u +%s) # 将起始时间转换为时间戳 start_timestamp=$(date -d "$START_TIME" +%s) # 计算差值 diff_seconds=$((current_timestamp - start_timestamp)) diff_days=$((diff_seconds / 86400)) abs_diff_days=$((diff_days < 0 ? -diff_days : diff_days)) # 输出结果 echo "两个时间的天数差值(带正负):$diff_days" echo "天数差值的绝对值:$abs_diff_days"
兼容性提示
如果是在macOS系统上,date命令是BSD版本,语法略有不同,转换时间戳需要用-j、-f参数指定格式:
# macOS下转换START_TIME为时间戳 start_timestamp=$(date -j -u -f "%Y-%m-%dT%H:%M:%SZ" "$START_TIME" +%s) # macOS下获取当前UTC时间戳 current_timestamp=$(date -j -u +%s)
内容的提问来源于stack exchange,提问作者user6505873
相关产品推荐
相关产品推荐

