2

次のようなクラスがあります。

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 に何か特別なものがあるのか​​知りたいですか?

4

0 に答える 0