[Android] 日本語ロケールで失敗したソースコード

| トラックバック(0) |

日本で Android Market が使えるようになったら公開しよう!

と、仕込んでおいた(半年前に作成した)アプリが「英語環境(ADP1)では動作するが、日本語環境(HT-03A)では動作せず」。。。

調べてみると、以下のソースコードが問題でした。

 

問題のソースコード

// ここまでに String 型の inDate 変数に
// "Wed, 22 Jul 2009 00:00:00 +0900" という文字列がセットされている前提
// 問題のソースコード↓
SimpleDateFormat inFormat = new
    SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz");
Date date = inFormat.parse(inDate);
// 問題のソースコード↑
// 英語環境では、date に正しく値が返されていたが、
// 日本語環境では、date に null が返されていた \></omg!

何が問題なんでしょうか???

これだけでは、伝わらないと思いますので、もう少しやりたいことを補足すると、

"Wed, 22 Jul 2009 00:00:00 +0900" という(英語ロケールでの書式)文字列から Date 型のインスタンスを得るために、
SimpleDateFormat クラスの parse() メソッドを呼び出しているのですが、
これが、英語環境では成功していたのに、日本語環境では失敗してしまうのです・・・。

 

修正後のソースコード

日本語環境(というより、厳密に言えば、英語環境以外)でも正しく動作するように修正したコードは、以下のようになります。

// 修正後のソースコード
SimpleDateFormat inFormat = new
    SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss zzz",
        Locale.ENGLISH); // ←を追加(これだけ)
Date date = inFormat.parse(inDate);

修正したのは、SimpleDateFormat クラスのコンストラクタの第2引数に、明示的に英語ロケールを指定してあげただけです。

というのは、そもそも第1引数の書式が英語ロケールを期待しているからです。

SimpleDateFormat クラスは、明示的にロケールを指定されない限り、デフォルトロケールで動作するのが仕様のため、
問題のコードでは、明示的にロケールを指定していなかったため、
英語環境では、英語ロケールのため、問題なし(=第1引数の書式を正く解析できる)。
日本語環境では、日本語ロケールとなり、問題あり(=第1引数の書式を正く解析できない)となっていました。

 

少々、ニッチな話になってしまいましたが、伝えたいことは、

「少なくとも、英語と日本語ロケールでテストせよ!」

ということです。

 

幸いにも、HT-03A では、英語と日本語ロケールを積んでいるので、両方のテストが可能ですし、
Android SDK 1.5 のエミュレーターも同様です。

いまのところ、ADP1 だと、Android 1.5 にアップデートしても、英語ロケールしかないので、ADP1 だけでテストしている方は、
上記のように日本語ロケールを積んでいる環境でテストした方がよいかもしれません。

 

最後に一言・・・ 

「認めたくないものだな、自分自身の若さゆえの過ちというものを」

実は、このエントリ、↑の名言を言いたいだけです ^^;

トラックバック(0)

トラックバックURL: http://mt.adakoda.com/mt-tb.cgi/247

Android Advent Calendar 2011

2012年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29