了解命令的输出:date -d“12:24“

了解命令的输出:date -d“12:24“

有人能帮助我理解为什么添加下面的任何小写字母(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”代表负偏移的区域。

这些字母通常与军事时间。例如,上午 6:00 区域 协调世界时−5 写作“0600R”,读作“零六百罗密欧”。

相关内容