3

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

问题是当有这样的日期时: 星期三,2002 年 10 月 2 日 13:00:00 GMT 我必须使用模式:

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

但它也可以是这样的日期:Wed, 02 Oct 2002 15:00:00 +0200。在这种情况下 ZZZ 不起作用,我必须使用一个 Z:

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

如何创建通用解决方案?

4

2 回答 2

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();
    

使用上述任何解决方案,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

注意:我相信如果您在所有模式中都有共同的部分并且它们之间的差异很小,那么第一个解决方案会更好。如果模式彼此非常不同,则第二种解决方案会更好。但我也相信这是一个见仁见智的问题,由你来选择。

于 2017-05-04T12:28:11.507 回答
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;
        }
    }
}
于 2017-05-03T22:51:58.257 回答