“UTC”是RFC 1123规范中的有效时区名称吗?

7
我正在使用一个API,它要求RFC 1123日期。如果我发送的请求中有类似于Thu, 04 Sep 2014 06:42:22 UTC的日期,它会被拒绝,因为有"UTC"。如果我修改字符串并将时区部分改为"GMT",则可以正常工作。
我还注意到许多语言(如Java、C#和Python)使用"GMT"字符串格式化RFC 1123格式的UTC日期,但是我正在使用的Go语言将其保留为"UTC"
我试图弄清楚这是否是语言错误,或者根据RFC不应使用"UTC"。参考链接:http://www.ietf.org/rfc/rfc1123.txt
1个回答

20

简短回答

使用UTGMT,而不是UTC

RFC 1123

我阅读RFC 1123的结论是,它采用RFC 822的日期时间格式,除了一些微调。

RFC 822

RFC 822中没有包含单词UTC。相反,第25页提到UTGMT的同义词。因此,您可以使用UT但不能使用UTC

RFC 2822

此外,RFC 822已被RFC 2822取代(是的,很可爱的编号)。该规范仅在定义时区偏移量时提到了UTC一次。但是该规范未将UTC作为标识符添加到格式中。因此,相同的规则,只在字符串中使用GMTUT

ISO 8601

RFC 822和1123定义的这种格式很糟糕。它难以阅读,难以解析,假设英语语言和文化,错误地将军事时区定向错误,错误地将UT等同于GMT,引用了不明确的通用时间,因为有多种UT类型,而UTC只是其中之一,并鼓励使用既非标准化又不唯一的三个或四个字母代码来表示时区的不良实践。

如果可能的话,请使用ISO 8601,正如Jukka“Yucca”Korpela在这里中所讨论的一样。该标准是在RFC 822发布几年后被ISO采用的。ISO 8601更为合理,并且正在被现代协议和商业/工业所采用。
ISO 8601格式示例:
2014-09-06T13:35:58-02:00
2014-09-06T15:35:58Z

编程

如果Go语言自带的库在生成UTC格式时出现错误,建议您提交错误报告。

java.time

FYI,Java包含业界领先的日期时间框架,即java.time类。这些类内置于Java 8及更高版本中,[回溯到Java 6和7][5]以及[Android][6]。在[OpenJDK][7]项目中作为开源提供。
java.time类在解析/生成字符串以表示其日期时间值时,默认使用ISO 8601格式。
此外,[DateTimeFormatter][8]类提供了一个专门用于https://www.rfc-editor.org/rfc/rfc1123的格式化程序,即DateTimeFormatter.RFC_1123_DATE_TIME,生成诸如Tue, 3 Jun 2008 11:05:30 GMT的字符串。
在IdeOne.com上查看此示例[代码实时演示][9]。
Instant instant = Instant.now() ; // Current moment in UTC.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ; // A wrapper around Instant, more flexible such as formatting.
DateTimeFormatter f = DateTimeFormatter.RFC_1123_DATE_TIME ;
String output = odt.format( f ) ;

instant.toString(): 2016-11-15T21:12:49.261Z

odt.toString(): 2016-11-15T21:12:49.261Z

output: Tue, 15 Nov 2016 21:12:49 GMT

即时时间的字符串表示形式:2016年11月15日21:12:49.261 Z
odt的字符串表示形式:2016年11月15日21:12:49.261 Z
输出结果为:周二,2016年11月15日21:12:49格林威治标准时间

关于 java.time

java.time 框架是内置于 Java 8 及更高版本中的。这些类替代了诸如 legacy 旧日期时间类,例如 java.util.Date, Calendar, & SimpleDateFormat

Joda-Time项目现在处于维护模式,建议迁移到java.time类。

欲了解更多信息,请参见Oracle教程。并搜索Stack Overflow以获取许多示例和说明。规范是JSR 310

您可以直接与数据库交换java.time对象。使用符合JDBC 4.2或更高版本的JDBC驱动程序。无需字符串,也不需要java.sql.*类。

如何获取java.time类?

这个 ThreeTen-Extra 项目扩展了 java.time 的一些类。该项目是 java.time 可能未来增加内容的试验场。你可能会在这里找到一些有用的类,例如 IntervalYearWeekYearQuarter,以及 more
[5]: http://www.threeten.org/threetenbp/ [6]: https://github.com/JakeWharton/ThreeTenABP [7]: http://openjdk.java.net [8]: http://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html?is-external=true [9]: http://ideone.com/PI5vlu

2
我认为RFC 822和RFC 2822的编号并非完全巧合,这是与其他一些RFC一起完成的:821-2821、977-3977、2222-4422、2440-4880、2960-4960! - Steve Klösters
太棒了,我自己也在阅读规范RFC,而且在来这里之前我也在考虑RFC 822和1123的问题。如果像@stevuu所说的那样,这种格式很常见,那我就得为它编写一个特定的函数。祝好。 - David L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接