2011-05-13 51 views
11

我想使用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]); 
      } 

回答

8

使用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個異常,但如果這不需要高性能,那可能不是那麼糟糕。

+0

小寫字母z不會在Joda-Time中解析,因爲三個字母的縮寫是不明確的 – JodaStephen 2011-06-15 07:03:01

5

處理這個問題的唯一「更優雅」方法是編寫自己的DateTimeParser實現。使用DateTimeFormatterBuilder,您可以將不工作的部分(日/月/區域解析)粘貼在一起(解析一個或多個空格,解析括號中的可選時區縮寫),爲這些位編寫新的解析器這需要特殊的格式。