datetime - "UTC"是 RFC 1123 规范的有效时区名称吗?

标签 datetime rfc

我正在处理一个 API,它请求 RFC 1123 日期。如果我发送日期为 Thu, 04 Sep 2014 06:42:22 UTC 的请求它因为 "UTC" 而被拒绝部分。如果我操纵字符串并制作时区部分 "GMT"有用。

我还注意到许多语言(Java、C#、Python)都使用时区字符串 "GMT" 以 RFC 1123 格式格式化 UTC 日期。但是我使用的语言 Go 将其保留为 "UTC" .

我试图了解这是语言错误还是 "UTC"根据 RFC 根本不应该使用:http://www.ietf.org/rfc/rfc1123.txt

最佳答案

简答
使用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 是一,并鼓励使用 3 或 4 个字母代码来表示既不标准化也不唯一的时区的不良做法。
如果可能,请使用 ISO 8601相反,正如所讨论的 here朱卡“丝兰”科尔佩拉。该标准在 RFC 822 发布几年后被 ISO 采用。 ISO 8601 更为明智,并且正在被现代协议(protocol)和商业/工业中采用。
ISO 8601 格式示例:

2014-09-06T13:35:58-02:00
2014-09-06T15:35:58Z
编程
如果与 Go 捆绑的库正在生成 UTC对于该格式不正确,我建议您提交错误报告。
java.time
仅供引用,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



关于 java.time
java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .
Joda-Time项目,现在在 maintenance mode , 建议迁移到 java.time类。
要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 上搜索许多示例和解释。规范为 JSR 310 .
您可以直接与您的数据库交换 java.time 对象。使用 JDBC driver符合 JDBC 4.2或更晚。不需要字符串,不需要java.sql.*类。
从哪里获得 java.time 类?
  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 , 和更高版本 - 标准 Java API 的一部分,具有捆绑的实现。
  • Java 9 添加了一些小功能和修复。
  • Java SE 6Java SE 7
  • 大多数 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7。 .
  • Android
  • java.time 类的更高版本的 Android 捆绑实现。
  • 对于早期的 Android (<26),ThreeTenABP项目适应ThreeTen-Backport (上文提到的)。见 How to use ThreeTenABP… .

  • ThreeTen-Extra项目通过附加类扩展了 java.time。该项目是 future 可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 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

    关于datetime - "UTC"是 RFC 1123 规范的有效时区名称吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25658897/

    相关文章:

    mysql - 使用 MySQL,如何将当前时间存储为 UTC 时间?

    java - 返回给定日期的 BST/GMT

    java - javamail 中使用的 mail.smtp.sendpartial 属性是否特定于 sun 实现?

    JSON-RPC 和 Json-rpc 服务发现规范

    email - 电子邮件地址区分大小写吗?

    ftp - FTP ACCT 命令的用途是什么?

    vb.net - 如何将 1400-1500 转换为下午 2 点 - 3 点?

    java - 为什么我的 DateTime 反序列化会截断 DateTime 分钟/秒/毫秒?

    java - 有没有一种方法可以在获取以下预期的日期中添加月份

    ssh - diffie-hellman ssh key 交换