How/why 是“日期”,检测输入格式“yyyymmddThhmmssZ”的多个时区部分

How/why is `date` detecting multiple timezone parts for input format `yyyymmddThhmmssZ`

在尝试解析带有嵌入式时间戳的 AWS 日志文件名时,我 运行 跨越以下

$ date --version
date (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by David MacKenzie

$ realpath /etc/localtime
/usr/share/zoneinfo/America/New_York

$ echo $TZ


$ date --utc --date='20211114T0155Z' --debug
date: parsed number part: (Y-M-D) 2021-11-14
date: parsed zone part: UTC+07
date: parsed number part: 01:55:00
date: parsed zone part:
date: input timezone: parsed date/time string (+00)
date: error: seen multiple time-zone parts
date: invalid date ‘20211114T0155Z’

在与同事交谈时(在多个时区),似乎某些 shell 可能会找到 UTC-07 而不是我的 (WSL2 Ubuntu) UTC+7 的时区,无论实际时区。这可能是由于 OSX 特别是由于版本差异(我的 OSX 同事似乎有 date 版本 9 而我是 运行 8.3)。

我查看了 info date,但没有找到任何看起来可以解释这一点的内容。相反,第 29.5 节包含以下内容:

The ISO 8601 date and time of day extended format consists of an ISO 8601 date, a ‘T’ character separator, and an ISO 8601 time of day. This format is also recognized if the ‘T’ is replaced by a space

尽管这部分说 T 等同于 space,但这似乎不是真的:

$ date --utc --date='20211114T0155Z'
date: invalid date ‘20211114T0155Z’

$ date --utc --date='20211114 0155Z'
Sun Nov 14 01:55:00 UTC 2021

我认为这归结为 parse-datetime 中使用的启发式方法确定这是军事时间而不是 ISO 8601 基本格式。

我还没有追踪到所有 parse-datetime,但我相信 date 版本 8.3 和版本 9 之间“幻影时区”的符号差异来自 gnulib#5c438e8 and that seems like fairly strong evidence that this is what is happening. Additionally, without being familiar with this library at all, it seems reasonable that this parser section 可能会专门生成这个幻影时区。

这感觉像是 parse-datetime 实现中的一个错误,但现在我觉得我的好奇心得到了满足。

我会把这个问题搁置一段时间,以防有更多经验的人有更好的答案,我会随时接受这个问题,现在或将来。