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

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

问题是,当有类似的日期时:
2002年10月2日,星期三,格林尼治标准时间
我必须使用模式:

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

但是它也可能是这样的日期:2002年10月2日,星期三15:00:000200.在这种情况下,ZZZ无法正常工作,我必须使用一个Z:

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

如何创建通用解决方案?

解决方法:

我已经使用JodaTime 2.7进行了测试,发现了两种方法:

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

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

使用上述任何解决方案,格式化程序都可以使用以下两种输入:

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

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

上一篇:如何通过python中的feedparser收集所有feed?


下一篇:php – 照片RSS Feed显示