我想使用 joda 来解析电子邮件中的日期时间字符串。不幸的是,我得到了各种不同的格式,例如
Wed, 19 Jan 2011 12:52:31 -0600
Wed, 19 Jan 2011 10:15:34 -0800 (PST)
Wed, 19 Jan 2011 20:03:48 +0000 (UTC)
Wed, 19 Jan 2011 17:02:08 -0600 (CST)
Fri, 21 Jan 2011 10:39:55 +0100 (CET)
Fri, 21 Jan 2011 17:50:42 -0500 (EST)
Wed, 06 Apr 2011 15:38:25 GMT
Thu, 7 Apr 2011 11:38:24 +0200
Fri, 8 Apr 2011 05:13:36 -0700 (MST)
20 Apr 2011 03:00:46 -0400
下面的代码捕获了大多数变体,但不是全部(例如,当有两个空格而不是一个时,当逗号丢失时等)。而且看起来很尴尬。
有没有更优雅的方法来解决这个问题?请指教。
DateTimeParser[] parsers = {
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CET)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CST)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CEST)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(GMT)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(MST)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(PST)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(UTC)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(EST)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(EDT)'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '(CDT)'").getParser(),
};
DateTimeFormatter inputFormatter = new DateTimeFormatterBuilder().append(null, parsers).toFormatter();
try {
calendar = inputFormatter.withLocale(Locale.US).parseDateTime(date[0]);
}
catch(Exception e) {
System.out.println("problem with " + date[0]);
}
除了自己使用 Joda 的DateTimeParser
并基本上自己解析文本以建立一个有效的 DateTime(我认为这将是很多工作)之外,我认为您的方法并没有太大问题。 我确实认为你有太多的格式。 我认为您的格式集可以简化为:
DateTimeParser[] parsers = {
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss Z '('z')'").getParser(),
DateTimeFormat.forPattern("E, d MMM y HH:mm:ss z").getParser(),
DateTimeFormat.forPattern("dd MMM y HH:mm:ss Z").getParser(),
};
Z(大写字母-Z)是RFC 822数字时区,小z是时区的首字母缩略词,例如PDT。 这仍然是(平均)每个解析请求抛出 2 个异常,但如果这不需要高性能,那可能还不错。
处理此问题的唯一"更优雅"的方法是编写自己的DateTimeParser实现。使用 DateTimeFormatterBuilder,您可以将正常工作的部分(日/月/区域解析)与不起作用的部分(解析一个或多个空格,解析括号中的可选时区缩写)粘合在一起,为那些需要特殊格式的位编写一个新的解析器。