joda - 解析RSS项目中pubDate的时区

时间:2013-06-27 21:48:00

标签: java parsing rss jodatime rss-reader

我正在使用Joda在RSS项目中解析pubDate。日期必须是RFC-822格式: http://feed2.w3.org/docs/error/InvalidRFC2822Date.html

问题是当有一个日期时: Wed,2002年10月2日13:00:00 GMT 我必须使用模式:

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

但它也可以是日期:星期三,2002年10月2日15:00:00 +0200 。在这种情况下,ZZZ不起作用,我必须使用一个Z:

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

如何创建通用解决方案?

2 个答案:

答案 0 :(得分:2)

我已经用 JodaTime 2.7 进行了测试,并找到了两种方法:

  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();
    
  3. 使用上述任何解决方案,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 :(得分: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;
        }
    }
}