Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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 解析RSS可能的日期RFC 822/8339和ISO 8601?_Java_Android_Date_Time_Rss - Fatal编程技术网

Java 解析RSS可能的日期RFC 822/8339和ISO 8601?

Java 解析RSS可能的日期RFC 822/8339和ISO 8601?,java,android,date,time,rss,Java,Android,Date,Time,Rss,我一直在开发一个feed阅读器应用程序,我需要从RSS和Atom解析de pubDate。根据RSS协议,pubDate应采用RFC 822格式,但我发现一些RSS发布商采用了不同的日期格式,这是我目前的做法,不确定这是否是最好的方式,建议如下: 相关代码如下: //List that keeps the data formats allowed private static List<String> formats; static { formats = Arrays.a

我一直在开发一个feed阅读器应用程序,我需要从RSS和Atom解析de pubDate。根据RSS协议,pubDate应采用RFC 822格式,但我发现一些RSS发布商采用了不同的日期格式,这是我目前的做法,不确定这是否是最好的方式,建议如下:

相关代码如下:

//List that keeps the data formats allowed
private static List<String> formats;

static {
    formats = Arrays.asList(
            //RFC 822 possible formats
            "EEE, d MMM yyyy HH:mm:ss zzz", //Sun, 19 May 2002 15:21:36 GMT
            "EEE, d MMM yyyy HH:mm zzz", // Sun, 19 May 2002 15:21 GMT
            "EEE, d MMM yyyy HH:mm:ss", // Sun, 19 May 2002 15:21:36
            "EEE, d MMM yyyy HH:mm", // Sun, 19 May 2002 15:21
            "d MMM yyyy HH:mm:ss zzz",  // 19 May 2002 15:21:36 GMT
            "d MMM yyyy HH:mm zzz", // 19 May 2002 15:21 GMT
            "d MMM yyyy HH:mm:ss", // 19 May 2002 15:21:36
            "d MMM yyyy HH:mm", // 19 May 2002 15:21
            //RFC 8339
            "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ", // 1996-12-19T16:39:57-0800
            "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSZZZ", // 1937-01-01T12:00:27.87+0020
            "yyyy'-'MM'-'dd'T'HH':'mm':'ss", // 1937-01-01T12:00:27
            //ISO 8601 same as RFC8339 but it allows to ommit the 'T' and replace it with a ' '.
            "yyyy'-'MM'-'dd' 'HH':'mm':'ssZZZ", // 1996-12-19 16:39:57-0800
            "yyyy'-'MM'-'dd' 'HH':'mm':'ss.SSSZZZ", // 1937-01-01 12:00:27.87+0020
            "yyyy'-'MM'-'dd' 'HH':'mm':'ss" // 1937-01-01 12:00:27
    );

}

/*
 Parses a string with a date and returns the milliseconds. The RSS standard says that dates are
 formatted according to RFC 822 however some are in RFC 3339 or ISO6091 format, so a brute force
 approach is made to parse the date, if it fails null is returned;
 */
public static Long getDateFromString( String date){

    for(String format: formats){

        //Creates SimpleDateFormat with US Locale as recommend in google docs to parse the input
        SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.US);

        try{
              return sdf.parse(date).getTime();
        }catch (ParseException ex){
            Log.i("Utils","Wrong date format: inputDate: " +date + " format: " + format);
            ex.printStackTrace();
        }

    }

    return null;
}
//保留允许的数据格式的列表
私有静态列表格式;
静止的{
formats=Arrays.asList(
//RFC 822可能的格式
“EEE,d MMM yyyy HH:mm:ss zzz”,//太阳,2002年5月19日15:21:36 GMT
“EEE,d MMM yyyy HH:mm zzz”,//太阳,2002年5月19日15:21 GMT
“EEE,d MMM yyyy HH:mm:ss”,//太阳,2002年5月19日15:21:36
“EEE,d MMM yyyy HH:mm”,//太阳,2002年5月19日15:21
“d MMM yyyy HH:mm:ss zzz”//2002年5月19日15:21:36 GMT
“d MMM yyyy HH:mm zzz”//2002年5月19日格林威治标准时间15:21
“d MMM yyyy HH:mm:ss”//2002年5月19日15:21:36
“d MMM yyy HH:mm”//2002年5月19日15:21
//RFC 8339
“yyyy'-'MM'-'dd'T'HH':'MM':'ssZZZ',//1996-12-19T16:39:57-0800
“yyyy'-'MM'-'dd'T'HH':'MM':'ss.SSSZZZ',//1937-01-01T12:00:27.87+0020
“yyyy'-'MM'-'dd'T'HH':'MM':'ss',//1937-01-01T12:00:27
//ISO 8601与RFC8339相同,但它允许ommit“T”并将其替换为“”。
“yyyy'-'MM'-'dd'HH':'MM':'ssZZZ',//1996-12-19 16:39:57-0800
“yyyy'-'MM'-'dd'HH':'MM':'ss.SSSZZZ',//1937-01-01 12:00:27.87+0020
“yyyy”-“MM”-“dd”HH:“MM:“ss”//1937-01-01 12:00:27
);
}
/*
解析带有日期的字符串并返回毫秒。RSS标准规定日期是
根据RFC 822格式化,但是有些是RFC 3339或ISO6091格式,所以是蛮力
方法解析日期,如果失败,则返回null;
*/
公共静态长getDateFromString(字符串日期){
for(字符串格式:格式){
//按照google文档中的建议,使用US语言环境创建SimpleDataFormat以解析输入
SimpleDataFormat sdf=新的SimpleDataFormat(格式,Locale.US);
试一试{
返回sdf.parse(date.getTime();
}捕获(解析异常){
Log.i(“Utils”,“错误的日期格式:inputDate:+日期+”格式:+格式);
例如printStackTrace();
}
}
返回null;
}
它在Android上,所以使用Joda Time不是一个选项,因为据我所知,它的初始化速度很慢,而且是一个巨大的库。 我也知道SimpleDataFormat不是线程安全的,但这在我的情况下并不重要

提前谢谢