需要灵活的日期时间转换与joda

我想用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(Capital-Z)是RFC 822数字时区,small-z是时区的首字母缩写,例如PDT。 这仍然(平均)每个解析请求抛出2个exception,但如果这不需要高性能,那可能不是那么糟糕。

处理此问题的唯一“更优雅”方法是编写自己的DateTimeParser实现。 使用DateTimeFormatterBuilder,您可以将工作的部分(日/月/区域解析)与不起作用的部分(解析一个或多个空格,解析括号中的可选时区缩写)粘合在一起,为这些位编写新的解析器它需要特殊的格式。