You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本计算GitHub PR创建时间差时date命令报错如何解决

问题根因

报错是连锁问题导致的:

  • 运行环境为macOS时,系统默认自带的是BSD版本的date工具,不支持Linux下GNU版date的-d(指定待解析日期)参数,传入ISO格式的PR创建时间后直接触发格式错误,子命令无有效返回值。
  • 从执行日志看,存储PR创建时间的Created_Date变量值额外包裹了双引号(日志打印为"2022-05-26T17:50:36Z"),多余的引号也会导致日期解析逻辑失效。
  • date命令执行失败后,算术运算表达式中减号后缺少有效操作数,最终触发syntax error: operand expected的语法报错。
解决方案

根据使用场景二选一即可。

方案1:适配macOS原生BSD date(无需额外安装软件)

BSD版date需要通过-f参数指定输入日期的格式,同时必须加-j参数避免误修改系统时间,修改后的代码如下:

# 先清除变量中多余的包裹引号
Created_Date=$(echo "${Created_Date}" | tr -d '"')
# 计算日期间隔
DIFFERENCE_DAYS=$(( ($(date '+%s') - $(date -j -f "%Y-%m-%dT%H:%M:%SZ" "${Created_Date}" '+%s')) / 86400 ))

参数说明:

  • -j:仅做日期解析输出,不修改系统时间,BSD环境下必加
  • -f "%Y-%m-%dT%H:%M:%SZ":指定输入日期为UTC时区的ISO8601格式,和GitHub返回的PR创建时间格式完全匹配

方案2:兼容多环境的通用写法

如果需要脚本同时兼容Linux和macOS,可以安装GNU版coreutils统一命令行为,再做环境自动适配:

  1. macOS下先通过Homebrew安装GNU工具集:
    brew install coreutils
    
  2. 脚本中增加命令适配逻辑:
    # 自动识别当前环境的GNU date命令
    if command -v gdate >/dev/null 2>&1; then
        DATE_BIN="gdate"
    else
        DATE_BIN="date"
    fi
    
    # 清除变量多余引号
    Created_Date=$(echo "${Created_Date}" | tr -d '"')
    # 计算日期间隔
    DIFFERENCE_DAYS=$(( ($($DATE_BIN '+%s') - $($DATE_BIN '+%s' -d "${Created_Date}")) / 86400 ))
    
注意事项
  • 计算逻辑通过秒级时间戳差除以86400(单日秒数)得到间隔天数,结果为向下取整的整数,满足"创建超过5天"的判断需求
  • GitHub返回的PR创建时间带Z后缀标识为UTC时区,两种方案的解析逻辑都会正确识别时区,不会出现时间偏差

内容的提问来源于stack exchange,提问作者Mohan V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:06:41