2014-02-17 80 views
5

我正在使用bash 4.1。我正在使用字母来分隔要由date转换的日期字符串的日期和时间字段。看来每个字母都会在指定的时间内添加一个不同的值(从-5到+18)。但请注意,J会导致错误。在maninfo页面中找不到此行为的解释。有人能够启发我吗?日期字符串中的字母分隔符是什么(除了分隔符)?

$ date -d 2014-01-01A00:00:00 
Tue Dec 31 19:00:00 CST 2013 
$ date -d 2014-01-01B00:00:00 
Tue Dec 31 20:00:00 CST 2013 
$ date -d 2014-01-01C00:00:00 
Tue Dec 31 21:00:00 CST 2013 
$ date -d 2014-01-01D00:00:00 
Tue Dec 31 22:00:00 CST 2013 
$ date -d 2014-01-01E00:00:00 
Tue Dec 31 23:00:00 CST 2013 
$ date -d 2014-01-01F00:00:00 
Wed Jan 1 00:00:00 CST 2014 
$ date -d 2014-01-01G00:00:00 
Wed Jan 1 01:00:00 CST 2014 
$ date -d 2014-01-01H00:00:00 
Wed Jan 1 02:00:00 CST 2014 
$ date -d 2014-01-01I00:00:00 
Wed Jan 1 03:00:00 CST 2014 
$ date -d 2014-01-01J00:00:00 
date: invalid date `2014-01-01J00:00:00' 
$ date -d 2014-01-01K00:00:00 
Wed Jan 1 04:00:00 CST 2014 
$ date -d 2014-01-01L00:00:00 
Wed Jan 1 05:00:00 CST 2014 
$ date -d 2014-01-01M00:00:00 
Wed Jan 1 06:00:00 CST 2014 
$ date -d 2014-01-01N00:00:00 
Tue Dec 31 17:00:00 CST 2013 
$ date -d 2014-01-01O00:00:00 
Tue Dec 31 16:00:00 CST 2013 
$ date -d 2014-01-01P00:00:00 
Tue Dec 31 15:00:00 CST 2013 
$ date -d 2014-01-01Q00:00:00 
Tue Dec 31 14:00:00 CST 2013 
$ date -d 2014-01-01R00:00:00 
Tue Dec 31 13:00:00 CST 2013 
$ date -d 2014-01-01S00:00:00 
Tue Dec 31 12:00:00 CST 2013 
$ date -d 2014-01-01T00:00:00 
Tue Dec 31 11:00:00 CST 2013 
$ date -d 2014-01-01U00:00:00 
Tue Dec 31 10:00:00 CST 2013 
$ date -d 2014-01-01V00:00:00 
Tue Dec 31 09:00:00 CST 2013 
$ date -d 2014-01-01W00:00:00 
Tue Dec 31 08:00:00 CST 2013 
$ date -d 2014-01-01X00:00:00 
Tue Dec 31 07:00:00 CST 2013 
$ date -d 2014-01-01Y00:00:00 
Tue Dec 31 06:00:00 CST 2013 
$ date -d 2014-01-01Z00:00:00 
Tue Dec 31 18:00:00 CST 2013 
+0

时区最有可能 – Brian

+0

@GIJoe它似乎并不涉及'TZ'。挖掘资源是值得的。 – devnull

+0

@CPRitter一旦有人修复了它,就不会搞乱格式化。 – devnull

回答

5

看看它们的相关时间排序的字母:

YXWVUTSRQPON Z ABCDEFGHIKLM 

我强调Z因为这是(在你的例子)周三1月1日00:00:00 GMT 2014年上午代表西部时区(晚于格林尼治标准时间),纽约时区东部(晚些时候)。所以你得到格林威治标准时间,东部12个时区和西部12个,这使得25个。因为任何原因,J恰好是被遗漏的那封信。

+0

我想这解释了行为,但我没有任何来源。如果有参考答案出现,请确保您接受该答案。 –

+0

这里是关于这个主题的维基百科.. [链接](http://en.wikipedia.org/wiki/Nautical_time) – CPRitter

+2

我还是觉得很令人不安的是,'man'和'info'似乎都没有提到这一点。 – CPRitter

4

GNU date遵循RFC 822或ISO 8601在RFC 822(作废),作为替代的文件RFC 2822中描述,军事时区被定义:

的1个字符军事时区,以限定[RFC822]中的非标准方式 ,因此在其含义上是不可预知的。军事区“A”到“I”的原始定义分别为 ,相当于“+0100”到“+0900”; “K”,“L”和“M” 分别相当于“+1000”,“+1100”和“+1200”; “N” 到“Y”分别相当于“-0100”到“-1200”; ,“Z”相当于“+0000”。但是,由于 [RFC822]中的错误,除非 有带外信息确认它们的含义,否则它们应该全部被认为等同于“-0000”。

在RFC 822中,这被称为“小时区”。 RFC 822中的评论称它为“ANSI或军事”。

RFC 822

军方标准采用为每个区域的单个字符。 “Z” 是世界时间。 “A”表示提前一小时,“M”表示12小时前的 ; “N”是一个小时后,“Y”是12小时后的 。字母“J”未被使用。

这一切都很有意义,因为RFC 822很可能是在ARPANET和ARPANET出现在DoD圈子周围的时候编写的。

这是list of military time zones

顺便说一下,当地时间在军队中被特别指定为J区或“朱丽叶”。

+0

有帮助,谢谢; RFC 822定义以何种方式非标准/错误?鉴于'T'只是ISO 8601中的_literal_分隔符,GNU'date'如何决定是否将其解释为(因此时间为_local_)还是军事时区“UTC-07:00”? – mklement0

+0

@ mklement0:如果它有一个T并遵循ISO 8601,那么它可能将其解析为ISO 8601。RFC822看起来略有不同,它出现 – Brian

+0

@ mklement0:我不知道它们在RFC822中指的是什么错误。 https://en.wikipedia.org/wiki/ISO_8601 – Brian