2

私はフィード リーダー アプリに取り組んでおり、RSS と Atom から 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;
}

Android上にあるため、Joda-Timeを使用することはオプションではありません。私の知る限り、初期化が遅く、巨大なライブラリであるためです。また、 SimpleDateFormat がスレッドセーフではないことも知っていますが、私の場合は問題ありません。

前もって感謝します。

4

0 に答える 0