代码之家  ›  专栏  ›  技术社区  ›  nivekastoreth

“日期”如何/为什么检测输入格式“yyyymmddThhmssZ”的多个时区部分`

  •  1
  • nivekastoreth  · 技术社区  · 3 年前

    在尝试使用嵌入的时间戳解析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’
    

    在与同事交谈时(在多个时区),似乎有些外壳可能会找到一个时区 UTC-07 而不是我的(WSL2 Ubuntu) UTC+7 而不管实际时区如何。这可能是由于特定的OSX,也可能是由于版本差异(我的OSX同事似乎有 date 版本9,而我正在运行8.3)。

    我看了一遍 info date 还没有找到任何能解释这一点的东西。相反,第29.5条包含以下内容:

    ISO 8601日期和时间扩展格式包括 8601日期、T字符分隔符和ISO 8601时间。这 如果T被一个空格取代,格式也会被识别

    尽管这一部分说 T 相当于一个空间,但这似乎不是真的:

    $ date --utc --date='20211114T0155Z'
    date: invalid date ‘20211114T0155Z’
    
    $ date --utc --date='20211114 0155Z'
    Sun Nov 14 01:55:00 UTC 2021
    
    0 回复  |  直到 3 年前
        1
  •  0
  •   nivekastoreth    3 年前

    我相信这可以归结为在 parse-datetime 确定这是在军事时间而不是ISO 8601的基本格式。

    我还没有追踪到所有的 解析日期时间 虽然如此,但我相信两者之间“幻影时区”的符号差异 date 8.3和9版本来自 gnulib#5c438e8 这似乎是正在发生的事情的有力证据。此外,在完全不熟悉这个库的情况下 this parser section 可能会专门生成这个幻影时区。

    这感觉像是中的一个bug 解析日期时间 执行,但现在我觉得我的好奇心得到了满足。

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