次のようなクラスがあります。
public class DateUtil {
private final static SimpleDateFormat origDateFormat = new SimpleDateFormat("EEE MMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
private final static SimpleDateFormat reformatedDateFormat = new SimpleDateFormat("EEE., dd. MMM yyyy", Locale.GERMAN);
private final static String TAG = DateUtil.class.getSimpleName();
public static String reformatDateString(String origDateString) {
String reformattedDateString = origDateString;
try {
Date parsedDate = origDateFormat.parse(origDateString);
reformattedDateString = reformatedDateFormat.format(parsedDate);
}
catch (ParseException e) {
//if we can't parse the date, we don't change the format
Log.i(TAG, "Parse exception: " + e.getMessage());
}
return reformattedDateString;
}
public static boolean isBeforeCurrentDate(String dateString) throws ParseException {
Date parsedDate = origDateFormat.parse(dateString);
if (parsedDate.before(new Date(System.currentTimeMillis()))) {
return true;
}
return false;
}
}
...対応する JUnit テストを使用:
public class DateUtilTest {
@Test
public void formatCorrectString() {
String dateString = "Mon Sep 03 00:00:00 CEST 2007";
String expectedResult = "Mo., 03. Sep 2007";
String resultString = DateUtil.reformatDateString(dateString);
assertEquals(expectedResult, resultString);
}
@Test
public void testBeforeCurrentDate() throws ParseException {
String dateString = "Mon Sep 03 00:00:00 CEST 2007";
assertTrue(DateUtil.isBeforeCurrentDate(dateString));
}
}
これは機能します。しかし、私の Android アプリケーションでは、同じ日付文字列Mon Sep 03 00:00:00 CEST 2007の ParseException が常に発生します。ここで何が起こっているのですか?
【追記】
何が問題なのか分かりました。渡された文字列のタイムゾーンです。DateFormat の「z」を削除し、渡された日付文字列からタイムゾーンを削除すると、Android で動作します。
String dateString = zone.getEffectiveFrom().trim().replace("CEST", "").replace("GMT", "").replace("CET", "").replace("MESZ", "");
SimpleDateFormat: EEE MMM dd HH:mm:ss yyyy
渡された文字列: Mon Sep 03 00:00:00 2007
これは単なる回避策であり、解決策ではありませんが、日付文字列の時刻は必要ないので問題ありません。しかし、これがバグなのか、それとも Android に何か特別なものがあるのか知りたいですか?