在嘗試決議帶有嵌入式時間戳的 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在我運行 8.3 時似乎擁有版本 9)。
我已經看過了info date,但沒有找到任何可以解釋這一點的東西。相反,第 29.5 節包含以下內容:
ISO 8601 日期和時間擴展格式由 ISO 8601 日期、“T”字符分隔符和 ISO 8601 時間組成。如果 'T' 被空格替換,則此格式也被識別
盡管本節說 aT相當于一個空格,但這似乎不是真的:
$ date --utc --date='20211114T0155Z'
date: invalid date ‘20211114T0155Z’
$ date --utc --date='20211114 0155Z'
Sun Nov 14 01:55:00 UTC 2021
uj5u.com熱心網友回復:
我相信這歸結為正在使用的啟發式parse-datetime確定這是在軍事時間而不是 ISO 8601 基本格式。
我還沒有完全追溯parse-datetime,但我相信date8.3 版和 9 版之間“幻影時區”符號的差異來自gnulib#5c438e8,這似乎是相當有力的證據,表明這就是正在發生的事情。此外,在完全不熟悉這個庫的情況下,這個決議器部分可能專門生成這個幻影時區似乎是合理的。
這感覺像是實作中的一個錯誤parse-datetime,但現在我覺得我的好奇心得到了安撫。
如果有更多經驗的人有更好的答案,我會將這個問題保留一段時間,我會在現在或將來的任何時候接受這個答案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/362355.html
