有人能帮助我理解为什么添加下面的任何小写字母(az)会对 date -d 输出产生影响,以及该命令中的这些字母代表什么含义?
wip$ date -d "12:24 a"
Mon Apr 18 18:54:00 IST 2022
wip$ date -d "12:24 b"
Mon Apr 18 19:54:00 IST 2022
wip$ date -d "12:24 c"
Mon Apr 18 20:54:00 IST 2022
wip$ date -d "12:24 d"
Mon Apr 18 21:54:00 IST 2022
wip$ date -d "12:24 e"
Mon Apr 18 22:54:00 IST 2022
wip$ date -d "12:24 f"
Mon Apr 18 23:54:00 IST 2022
wip$ date -d "12:24 g"
Tue Apr 19 00:54:00 IST 2022
wip$ date -d "12:24 h"
Tue Apr 19 01:54:00 IST 2022
wip$ date -d "12:24 i"
Tue Apr 19 02:54:00 IST 2022
wip$ date -d "12:24 j"
date: invalid date ‘12:24 j’
wip$ date -d "12:24 k"
Tue Apr 19 03:54:00 IST 2022
wip$ date -d "12:24 l"
Tue Apr 19 04:54:00 IST 2022
wip$ date -d "12:24 m"
Tue Apr 19 05:54:00 IST 2022
wip$ date -d "12:24 n"
Mon Apr 18 16:54:00 IST 2022
wip$ date -d "12:24 o"
Mon Apr 18 15:54:00 IST 2022
wip$ date -d "12:24 p"
Mon Apr 18 14:54:00 IST 2022
wip$ date -d "12:24 q"
Mon Apr 18 13:54:00 IST 2022
wip$ date -d "12:24 r"
Mon Apr 18 12:54:00 IST 2022
wip$ date -d "12:24 s"
Mon Apr 18 11:54:00 IST 2022
wip$ date -d "12:24 t"
Mon Apr 18 10:54:00 IST 2022
wip$ date -d "12:24 u"
Mon Apr 18 09:54:00 IST 2022
wip$ date -d "12:24 v"
Mon Apr 18 08:54:00 IST 2022
wip$ date -d "12:24 w"
Mon Apr 18 07:54:00 IST 2022
wip$ date -d "12:24 x"
Mon Apr 18 06:54:00 IST 2022
wip$ date -d "12:24 y"
Mon Apr 18 05:54:00 IST 2022
wip$ date -d "12:24 z"
Mon Apr 18 17:54:00 IST 2022
手册页没有帮助。
我还发现在字母表前添加 + 或 - 会产生相同的输出。
wip$ date -d "12:24 -a"
Mon Apr 18 18:54:00 IST 2022
wip$ date -d "12:24 +a"
Mon Apr 18 18:54:00 IST 2022
谢谢你的帮助。
答案1
启用调试输出,我们可以知道它们被解析为时区说明符:
% date -d "12:24 v" --debug
date: parsed time part: 12:24:00
date: parsed zone part: UTC-09
date: input timezone: parsed date/time string (-09)
date: using specified time as starting value: '12:24:00'
date: using current date as starting value: '(Y-M-D) 2022-04-18'
date: starting date/time: '(Y-M-D) 2022-04-18 12:24:00 TZ=-09'
date: '(Y-M-D) 2022-04-18 12:24:00 TZ=-09' = 1650317040 epoch-seconds
date: timezone: system default
date: final: 1650317040.000000000 (epoch-seconds)
date: final: (Y-M-D) 2022-04-18 21:24:00 (UTC)
date: final: (Y-M-D) 2022-04-19 06:24:00 (UTC+09)
深入研究源代码,这些是在gnulib
的日期时间解析代码:
/* Military time zone table.
RFC 822 got these backwards, but RFC 5322 makes the incorrect
treatment optional, so do them the right way here.
Note 'T' is a special case, as it is used as the separator in ISO
8601 date and time of day representation. */
static table const military_table[] =
{
{ "A", tZONE, HOUR ( 1) },
[...]
{ "T", 'T', 0 },
[...]
{ "Z", tZONE, HOUR ( 0) },
{ NULL, 0, 0 }
};
他们是军事时区.来自维基百科:
军队时区在 ACP 121(I) 标准中定义,该标准由 武装部队澳大利亚、加拿大、新西兰、英国、美国和许多其他国家。名称与北约音标字母。
从东边本初子午线在格林威治,字母“Alpha”到“Mike”(跳过“J”,见下文)代表 12 个时区,正UTC 偏移量直到达到国际日期变更线从格林威治向西,字母“November”到“Yankee”代表负偏移的区域。