在JAVA中解析RFC 2822的日期

时间:2010-03-16 22:08:40

标签: java date parsing rfc2822

我需要在Java中解析日期的RFC 2822字符串表示。这里有一个示例字符串:

  

星期六,2010年3月13日11:29:05 -0800

它看起来非常令人讨厌,所以我想确保我做的一切正确,并且会在以后通过AM-PM /军事时间问题,UTC时间问题,我没有的问题解释错误的日期遇到奇怪的问题期待等...

谢谢!

5 个答案:

答案 0 :(得分:21)

这是快速代码,可以满足您的要求(使用 SimpleDateFormat

String rfcDate = "Sat, 13 Mar 2010 11:29:05 -0800";
String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern);
Date javaDate = format.parse(rfcDate);

//Done.

PS。我没有在这里处理异常和并发(因为解析日期时SimpleDateFormat不同步)。

答案 1 :(得分:20)

如果您的应用程序使用的是英语以外的其他语言,则可能需要使用备用的SimpleDateFormat构造函数强制使用语言环境进行日期解析/格式化:

String pattern = "EEE, dd MMM yyyy HH:mm:ss Z";
SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.ENGLISH);

答案 2 :(得分:6)

请注意,[星期几“,”]在RFC-2822中是可选的,因此建议的示例并未涵盖所有RFC-2822日期格式。另外,RFC-822日期类型允许许多不同的时区符号(obs-zone),“Z”格式说明符不包含这些符号。

我想没有简单的方法,除了寻找“,”和“ - | +”来确定使用哪种模式。

答案 3 :(得分:1)

自从Java 8实现了新的日期时间类:URL url = new URL("http://greatproducts.com/gizmos/img.jpg"); DataHandler dataHandler = new DataHandler(url); AttachmentPart attachment = message.createAttachmentPart(dataHandler); attachment.setContentId("attached_image"); java.time.ZonedDateTimejava.time.LocalDateTime支持几乎立即可用的RFC字符串解析:

ZonedDateTime

答案 4 :(得分:1)

有一个javax.mail类,它执行RFC-2822日期的解析:

javax.mail.internet.MailDateFormat

包括可选和过时的格式。

只需:

new javax.mail.internet.MailDateFormat().parse("Sat, 13 Mar 2010 11:29:00 -0800")
new javax.mail.internet.MailDateFormat().parse("13 Mar 2010 11:29:00 -0800")
new javax.mail.internet.MailDateFormat().parse("13 Mar 2010 11:29 -0800")

它将正确解析这些有效的RFC-2822日期

对于其他旧的DateFormatter,MailDateFormat类也不是线程安全的。