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

63

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

5个回答

75

这应该非常接近

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


7
如果您经常这样做,请确保重复使用SimpleDateFormat对象(它们的构造成本非常昂贵),并在调用parse时对其进行同步(它们不是线程安全的)。 - Ry4an Brase
20
标准并不只允许一种格式,而是三种格式。http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3 - Sridhar Ratnakumar
5
如果您要将那个日期对象与应用程序中的时间戳进行比较,请记住标头仅包括整秒,并且您应该丢弃最不重要的3位数字以便正确比较。因此,如果需要,请执行(TS/1000)* 1000 == headerTS。 - PålOliver
8
有人遇到“ParseException:Unparseable date”吗? - koppor
12
为避免出现“ParseException”,请改用以下语句:new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US) - Roman
显示剩余9条评论

63

1
顺便提一下,commons-httpclient已被org.apache.httpcomponents:httpclient取代。 - John Glassmyer
2
该类现在是org.apache.http.impl.cookie.DateUtils。http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/cookie/DateUtils.html - daveb
1
我必须使用 org.apache.http.client.utils.DateUtilshttpclient-4.3.3 - membersound
DateUtil仍然在内部使用SimpleDateFormat和ThreadLocal缓存。如果您还关注性能,请查看joda DateTimeFormatter。 - Massimo

35

java.time

使用新的Java日期和时间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 定义了这种格式。


25

3
仅仅是一个小细节,以防有人混淆:日期格式RFC是1123,这是在RFC 2616中提到的,链接在这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3.1 - daveb
1
@Raedwald本身已被RFC 2822所取代。 - ian

5
如果您正在使用URLConnection,那么已经有一个方便的方法。
请参见URLConnection#getLastModified
此方法解析日期字符串并返回毫秒值。然后,您可以使用该值创建Date

1
请注意,此方法使用已弃用的 Date.parse 方法,至少在 Oracle JDK 7 中是如此,该方法“似乎”支持所有三种 HTTP 1.1 Full Date 格式。 - Trevor Robinson

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