我需要在Java中解析日期的RFC 2822字符串表示。这里有一个示例字符串:
星期六,2010年3月13日11:29:05 -0800
它看起来非常令人讨厌,所以我想确保我做的一切正确,并且会在以后通过AM-PM /军事时间问题,UTC时间问题,我没有的问题解释错误的日期遇到奇怪的问题期待等...
谢谢!
答案 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.ZonedDateTime
。 java.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
类也不是线程安全的。