如何让GNU date工具正确解析带时区字符串的日期?
解决GNU date 8.4解析带时区ISO格式日期报错的问题
我之前碰到过和你完全一样的问题,这是因为GNU coreutils 8.4(CentOS 6默认自带的版本)对ISO 8601格式的支持有局限性——它没法正确识别YYYY-MM-DDTHH:MM:SS.sss TIMEZONE这种把T作为日期时间分隔符同时附加时区缩写的格式组合。
两种可行的解决方案:
方案1:把日期和时间之间的
T换成空格
调整命令为:date -d "2018-02-21 02:22:33.221 EST" "+%Y-%m-%dT%H:%M:%S.%3N %Z"执行后会正常输出:
2018-02-21T02:22:33.221 EST方案2:用时区偏移代替时区缩写
把EST替换成对应的UTC偏移量(EST对应UTC-5),命令改成:date -d "2018-02-21T02:22:33.221-0500" "+%Y-%m-%dT%H:%M:%S.%3N %Z"这个写法也能让老版本
date正确解析,输出结果和方案1一致。
问题根源说明:
当你不带时区执行date -d "2018-02-21T02:22:33.221"时,date会默认使用本地时区(你的环境是EST)来解析这个时间,所以能得到正确的转换结果。但加上时区缩写后,老版本的date工具无法处理T分隔符+时区缩写的组合,直接判定为无效日期。
这个格式兼容问题在较新的GNU coreutils版本(比如8.20及以上)已经被修复,新版本支持直接解析YYYY-MM-DDTHH:MM:SS.sss TIMEZONE格式,但CentOS 6因为维护周期限制,一直停留在8.4版本,所以需要用上面的临时解决办法来绕过这个限制。
内容的提问来源于stack exchange,提问作者Deian
相关产品推荐
相关产品推荐

