如何从HTTP Last-Modified标头解析日期?

lev*_*ovd 52 java date http http-headers

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

Sha*_*aun 71

这应该非常接近

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);
Run Code Online (Sandbox Code Playgroud)

的SimpleDateFormat

  • 该标准不允许使用一种格式,而是**三种**格式.http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 (17认同)
  • 如果你这样做,经常要确保重用SimpleDateFormat对象(构造它们的成本非常高)并在调用`parse`时它们同步(它们不是线程安全的). (7认同)
  • 有人得到"ParseException:Unparseable date"吗? (7认同)
  • 为了避免`ParseException`使用`new SimpleDateFormat("EEE,dd MMM yyyy HH:mm:ss z",Locale.US)` (7认同)
  • 如果要将Date对象与应用程序中的时间戳进行比较,请记住标题**仅包括整秒**并且您应该丢弃3个最低有效数字以便能够正确比较.如果需要,也可以(TS/1000)*1000 == headerTS. (5认同)
  • @SridharRatnakumar三种格式中的两种现在已经过时了,所以你需要的是新的SimpleDateFormat("EEE,dd MMM yyyy HH:mm:ss z",Locale.US).[https://tools.ietf.org/html/rfc7231#page-65](https://tools.ietf.org/html/rfc7231#page-65) (4认同)
  • +1几乎正确,`hh`应该是'HH`,小时是0-23. (3认同)
  • 我认为它可能是`new SimpleDateFormat("EEE,dd MMM yyyy HH:mm:ss zzz",Locale.US);`不要在其他语言环境中失败. (3认同)
  • 对我来说效果很好,谢谢!我唯一要说的是这个例子是针对 Locale.ENGLISH 的。 (2认同)

Boz*_*zho 63

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

(遗产:( DateUtil.parseDate(dateString)来自apache commons-httpclient))

它具有定义为Constant的正确格式,保证符合协议.

  • 该类现在是org.apache.http.impl.cookie.DateUtils http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/cookie/DateUtils.html (2认同)

ral*_*stx 23

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 );

  • 如果人们感到困惑,只是一个小问题:日期格式RFC是1123,这里引用RFC 2616:http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 (3认同)

Sta*_*vec 16

java.time

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

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

所述DateTimeFormatter类预定义了该特定格式的恒定RFC_1123_DATE_TIME.顾名思义,RFC 1123定义了这种格式.


Jin*_*won 5

如果你正在使用URLConnections,那么已经有了一个方便的方法.

请参阅 URLConnection#getLastModified

此方法解析日期字符串并返回毫秒值.然后你可以愉快地创造一个Date具有该价值的东西.