私はフィード リーダー アプリに取り組んでおり、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 がスレッドセーフではないことも知っていますが、私の場合は問題ありません。
前もって感謝します。