【问题标题】:How to parse Date from HTTP Last-Modified header?如何从 HTTP Last-Modified 标头解析日期?
【发布时间】:2010-12-28 03:50:14
【问题描述】:

HTTP Last-Modified 标头包含以下格式的日期(示例):
Wed, 09 Apr 2008 23:55:38 GMT
从此字符串中解析 java.util.Date 的最简单方法是什么?

【问题讨论】:

    标签: java http date http-headers


    【解决方案1】:

    java.time

    当使用新的Java Date and Time API 时,代码将是:

    ZonedDateTime zdt = ZonedDateTime.parse("Wed, 09 Apr 2008 23:55:38 GMT", DateTimeFormatter.RFC_1123_DATE_TIME);
    

    DateTimeFormatter 类为RFC_1123_DATE_TIME 中的特定格式预定义了一个常量。顾名思义,RFC 1123 定义了该格式。

    【讨论】:

      【解决方案2】:

      RFC 2616 定义了符合标准的客户必须理解的三种不同日期格式。

      Apache HttpClient 提供了一个符合标准的 DateUtil:

      https://hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/org/apache/http/client/utils/DateUtils.html

      https://apache.googlesource.com/httpclient/+/4.3.x/httpclient/src/main/java/org/apache/http/client/utils/DateUtils.java

      Date date = DateUtils.parseDate( headerValue );

      【讨论】:

      【解决方案3】:

      DateUtil.parseDate(dateString) 来自 apache http-components

      (旧版:DateUtil.parseDate(dateString)(来自 apache commons-httpclient))

      它具有定义为常量的正确格式,保证符合协议。

      【讨论】:

      • 顺便说一句,commons-httpclient 已被 org.apache.httpcomponents:httpclient 取代。
      • 类现在是 org.apache.http.impl.cookie.DateUtils hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/…
      • 我不得不使用org.apache.http.client.utils.DateUtils, httpclient-4.3.3
      • DateUtil 内部仍然使用 SimpleDateFormat 和 ThreadLocal 缓存。如果您也在寻找性能,请参阅 joda DateTimeFormatter
      【解决方案4】:

      这应该很接近

      String dateString = "Wed, 09 Apr 2008 23:55:38 GMT";
      SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
      Date d = format.parse(dateString);
      

      SimpleDateFormat

      【讨论】:

      • 如果您经常这样做,请确保重用 SimpleDateFormat 对象(构造它们的成本非常高)并在调用 parse 时对其进行同步(它们不是线程安全的)。跨度>
      • 该标准允许的不是一种格式,而是三种格式。 w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3
      • 如果您要将 Date 对象与应用程序中的时间戳进行比较,请记住标题仅包含整秒,并且您应该丢弃 3 个最低有效数字能够正确比较。如果需要,也可以这样做 (TS/1000)*1000 == headerTS。
      • 有人收到“ParseException: Unparseable date”吗?
      • 为了避免ParseException,请改用new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US)
      【解决方案5】:

      如果你使用URLConnections,已经有一个方便的方法。

      URLConnection#getLastModified

      此方法解析日期字符串并返回毫秒值。然后您可以愉快地创建一个具有该值的Date

      【讨论】:

      • 请注意,此方法使用已弃用的 Date.parse 方法,至少从 Oracle JDK 7 开始,它似乎支持所有三种 HTTP 1.1 Full Date 格式。跨度>
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2011-07-02
      相关资源
      最近更新 更多