String rfcDate = "Tue, 4 Dec 2018 17:37:31 +0100 (CET)";
if (rfcDate.matches(".*[ ]\\(\\w\\w\\w\\)$")) {
//Brackets with time zone are added sometimes, for example by JavaMail
//This must be removed before parsing
//from: "Tue, 4 Dec 2018 17:37:31 +0100 (CET)"
// to: "Tue, 4 Dec 2018 17:37:31 +0100"
rfcDate = rfcDate.substring(0, rfcDate.length() - 6);
}
//and now parsing...
DateTimeFormatter dateFormat = DateTimeFormatter.RFC_1123_DATE_TIME;
try {
ZonedDateTime zoned = ZonedDateTime.parse(rfcDate, dateFormat);
LocalDateTime local = zoned.toLocalDateTime();
} catch (DateTimeParseException e) { ... }
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")
7条答案
按热度按时间bttbmeg01#
这是一段快速代码,可以完成您的请求(使用**SimpleDateFormat**)
我在这里没有处理异常和并发(因为SimpleDateFormat在解析日期时不同步)。
rt4zxlrg2#
如果您的应用程序使用英语以外的其他语言,您可能希望使用备用SimpleDateFormat构造函数强制日期解析/格式化的区域设置:
23c0lvtd3#
请记住,[day-of-week“,"]在RFC-2822中是可选的,因此建议的示例并不涵盖所有RFC-2822日期格式。此外,RFC-822日期类型允许许多不同的时区表示法(obs-zone),“Z”格式说明符不涵盖这些表示法。
我想没有简单的出路,除了寻找“,”和“-|+”以确定使用哪个模式。
58wvjzkj4#
一个月
自从Java 8新的datetime类实现以来:
java.time.ZonedDateTime
和java.time.LocalDateTime
。ZonedDateTime
支持几乎开箱即用的RFC字符串解析:wribegjk5#
有一个javax.mail类执行RFC-2822日期的解析:
javax.mail.internet.MailDateFormat
包括可选的和过时的格式。
只需:
它将正确解析这些有效的RFC-2822日期
对于其他旧的DateFormatter,
MailDateFormat
类不是线程安全的。mnowg1ta6#
RFC 2822日期-时间字符串包含时区偏移量,例如,给定字符串 * Sat,13 Mar 2010 11:29:05 -0800 * 与UTC的时区偏移量为-08:00小时,即UTC的等效日期-时间可以通过将8小时添加到 * Sat,13 Mar 2010 11:29:05 * 来获得。
Java.时间
modern date-time API API使用
OffsetDateTime
表示带有时区偏移的日期-时间。从**Trail: Date Time**了解有关现代日期-时间API的更多信息。
1.您可以使用
y
代替u
,但可以使用I preferu
toy
。OffsetDateTime
with JDBC.c6ubokkw7#
试试这个: