2013-06-27 79 views
3

我使用Joda解析RSS項目中的pubDate。日期必須在RFC-822格式: http://feed2.w3.org/docs/error/InvalidRFC2822Date.htmljoda - 解析RSS項目中pubDate的時區

的問題是,當有一個像日期: 星期三,2002年10月02日13:00:00 GMT 我必須使用模式:

DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").withLocale(Locale.ENGLISH).withOffsetParsed(); 

但它也可以像約會:星期三,2002 15:00:00 +0200 10月2日在這種情況下ZZZ這麼想的工作,我必須使用一個Z:

DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").withLocale(Locale.ENGLISH).withOffsetParsed(); 

如何創建通用的解決方案?

+0

Java中RFC822時區解析的潛在副本http://stackoverflow.com/a/2823558 –

回答

2

我已經和JodaTime 2.7測試,發現2種方法來做到這一點:

  1. 使用DateTimeFormatterBuilder的可選解析器:

    // create parser for "GMT" 
    DateTimeParser gmtParser = DateTimeFormat.forPattern("ZZZ").getParser(); 
    
    // create parser for "+0200" 
    DateTimeParser offsetParser = DateTimeFormat.forPattern("Z").getParser(); 
    
    DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
        .appendPattern("EEE, dd MMM yyyy HH:mm:ss ") // common pattern 
        .appendOptional(gmtParser) // optional parser for GMT 
        .appendOptional(offsetParser) // optional parser for +0200 
        .toFormatter().withLocale(Locale.ENGLISH).withOffsetParsed(); 
    
  2. DateTimeFormatterBuilder可以接收解析器的陣列可用於解析不同的輸入:

    // create array with all possible patterns 
    DateTimeParser[] parsers = { 
        DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").getParser(), 
        DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").getParser() 
    }; 
    
    // create a formatter using the parsers array 
    DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
        .append(null, parsers) // use parsers array 
        .toFormatter().withLocale(Locale.ENGLISH).withOffsetParsed(); 
    

使用任何上面的解決方案,該formatter將與兩個輸入工作:

System.out.println(formatter.parseDateTime("Wed, 02 Oct 2002 13:00:00 GMT")); 
System.out.println(formatter.parseDateTime("Wed, 02 Oct 2002 15:00:00 +0200")); 

的輸出將是:

2002-10-02T13:00:00.000Z 
2002-10-02T15:00:00.000+02:00 

注:我相信如果你在所有模式中有一個共同部分,並且它們之間的差異很小,那麼第一種解決方案會更好。如果模式彼此非常不同,第二種解決方案會更好。但我也相信這是一個意見問題,這取決於你選擇。

1

解決方法解決:

dateTimeFormat = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").withLocale(Locale.ENGLISH).withOffsetParsed(); 
    dateTimeFormatOneZ = DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").withLocale(Locale.ENGLISH).withOffsetParsed(); 

private DateTime convertToDate(String pubDate) { 

    try { 
     return dateTimeFormat.parseDateTime(pubDate); 
    } catch (Exception e) { 
     try { 
      return dateTimeFormatOneZ.parseDateTime(pubDate); 
     } catch (Exception e1) { 
      return null; 
     } 
    } 
}