Android:SimpleDateFormatに潜む罠

某WebAPIを使っているアプリを作成中です。
そのWebAPIから取得できるJSONに、lastBuildDateという日付を表す項目があったので、せっかくなのでそれをパースして日本語表記で出力しようと思ったのですが、Javaだとどうやって日付の文字列をDateに戻すのだろうと…。

ググったら、SimpleDateFormatというクラスがありました!

lastBuildDateの形式は、”EEE, dd MMM yyyy HH:mm:ss Z”でした。
Wed, 23 Feb 2011 02:55:21 +0900
みたいな感じです。なので、それを指定してみました。

// 失敗・・・
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
// jsonはJSONObject
try {
    Date lastBuildDate = format.parse(json.getString("lastBuildDate"));
} catch (ParseException e) {
    Toast.makeText(context, e.getLocalizeMessage(), Toast.LENGTH_LONG).show();
}

パースに失敗したよ!というトーストが表示されました。何故に!?

わからなかったので、SimpleDateFormatについてさらに調べたところ、オブジェクトを生成するときに引数でLocaleを渡している例を発見。しかも日本語だとMMMとしたときとかに日本語になったりするらしい。それはパースできんわ。ということで、引数を足してみました。

// Locale.ENGLISHを追加。これで上手くいった!!
SimpleDateFormat format = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z", Locale.ENGLISH);
// jsonはJSONObject
try {
    Date lastBuildDate = format.parse(json.getString("lastBuildDate"));
} catch (ParseException e) {
    Toast.makeText(context, e.getLocalizeMessage(), Toast.LENGTH_LONG).show();
}

Androidというよりも、Javaの話題なのですが、Androidだと端末毎にLocaleが決まるので、注意が必要ですね。Localeを英語にしていたら気付かずにバグを仕込むところでした(まぁ英語にする場合はデバッグのときくらいですが)

以上です!!


タグ Android | パーマリンク.

コメント・トラックバック一覧

  1. Pingback: Tweets that mention Android:SimpleDateFormatに潜む罠 | 自転車で通勤しましょ♪ブログ -- Topsy.com

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です