Java joda-解析RSS项中pubDate的时区
我正在使用Joda解析RSS项中的pubDate。日期必须采用RFC-822格式: 问题是,如果有如下日期: 2002年10月2日星期三格林威治标准时间13:00:00 我必须使用模式:Java joda-解析RSS项中pubDate的时区,java,parsing,rss,jodatime,rss-reader,Java,Parsing,Rss,Jodatime,Rss Reader,我正在使用Joda解析RSS项中的pubDate。日期必须采用RFC-822格式: 问题是,如果有如下日期: 2002年10月2日星期三格林威治标准时间13:00:00 我必须使用模式: DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").withLocale(Locale.ENGLISH).withOffsetParsed(); 但也可以是这样的日期:Wed,2002年10月2日15:00:00+0200。在这种情况下,ZZ
DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss ZZZ").withLocale(Locale.ENGLISH).withOffsetParsed();
但也可以是这样的日期:Wed,2002年10月2日15:00:00+0200。在这种情况下,ZZZ不起作用,我必须使用一个Z:
DateTimeFormat.forPattern("EEE, dd MMM yyyy HH:mm:ss Z").withLocale(Locale.ENGLISH).withOffsetParsed();
如何创建通用解决方案?解决方案:
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;
}
}
}
我用JodaTime 2.7进行了测试,找到了两种方法:
//为“GMT”创建解析器
DateTimeParser gmtParser=DateTimeFormat.forPattern(“ZZZ”).getParser();
//为“+0200”创建解析器
DateTimeParser offsetParser=DateTimeFormat.forPattern(“Z”).getParser();
DateTimeFormatter formatter=新的DateTimeFormatterBuilder()
.appendPattern(“EEE,dd MMM yyyy HH:mm:ss”)//通用模式
.appendOptional(gmtParser)//GMT的可选解析器
.appendOptional(offsetParser)//用于+0200的可选解析器
.toFormatter().withLocale(Locale.ENGLISH).withOffsetParsed();
DateTimeFormatterBuilder
可以接收一组解析器,用于解析不同的输入:
//使用所有可能的模式创建数组
DateTimeParser[]解析器={
DateTimeFormat.forPattern(“EEE,dd MMM yyyy HH:mm:ss Z”).getParser(),
DateTimeFormat.forPattern(“EEE,dd-MMM-yyyy-HH:mm:ss-ZZZ”).getParser()
};
//使用解析器数组创建格式化程序
DateTimeFormatter formatter=新的DateTimeFormatterBuilder()
.append(null,解析器)//使用解析器数组
.toFormatter().withLocale(Locale.ENGLISH).withOffsetParsed();
格式化程序将同时处理两种输入:
System.out.println(formatter.parseDateTime(“Wed,2002年10月2日13:00:00 GMT”);
System.out.println(formatter.parseDateTime(“Wed,2002年10月2日15:00:00+0200”);
输出将是:
2002-10-02T13:00:00.000Z
2002-10-02T15:00:00.000+02:00
注意:如果所有模式都有一个共同的部分,并且它们之间的差异很小,我相信第一种解决方案会更好。如果模式彼此非常不同,则第二种解决方案更好。但我也相信这是一个意见问题,由您选择。Java中RFC822时区解析的潜在重复