为何GNU date解析yyyymmddThhmmssZ格式时会检测到多个时区部分
问题原因
这个问题是GNU coreutils 8.30及更早版本中date命令的解析bug导致的,和你查阅的文档描述不冲突:文档中提到的支持T分隔符的是带分隔符的扩展版ISO 8601格式(比如2021-11-14T01:55:00Z),而你使用的是无分隔符的紧凑ISO 8601格式,旧版解析逻辑对这类格式的适配有缺陷。
具体到你碰到的报错:
旧版date的解析器会把T后面紧跟的两位数字误识别为时区偏移的一部分,比如你的输入20211114T0155Z会被先误解析出UTC+07的时区,之后再识别到末尾代表UTC+00的Z标识,就会触发「多个时区部分冲突」的报错。不同环境下解析出+7还是-7是解析逻辑的分支差异,和系统本地时区无关。
而把T替换为空格后,解析器不会再误判时区前缀,会正常把后面的0155识别为小时分钟,最后识别Z为UTC时区,没有冲突所以解析成功。
解决方案
- 升级GNU coreutils到8.32及以上版本,该版本已经修复了这个解析bug
- 如果无法升级,可以先对时间戳做预处理再传给
date:- 方案一:把
T替换为空格再传入,示例命令:date --utc --date="$(echo 20211114T0155Z | tr 'T' ' ')" - 方案二:将紧凑格式转换为带分隔符的标准ISO 8601格式,所有版本的
date都能正常识别这类格式
- 方案一:把
另外macOS自带的是BSD版本date,解析逻辑和GNU版有原生差异,如果需要跨平台统一行为,可以在macOS上通过brew安装coreutils包,使用其中的gdate命令(GNU版date)。
内容的提问来源于stack exchange,提问作者nivekastoreth
相关产品推荐
相关产品推荐

