Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java joda-解析RSS项中pubDate的时区_Java_Parsing_Rss_Jodatime_Rss Reader - Fatal编程技术网

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

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

我正在使用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。在这种情况下,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进行了测试,找到了两种方法:

  • 使用DateTimeFormatterBuilder的可选解析器:

    //为“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时区解析的潜在重复