日本で 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 だけでテストしている方は、
上記のように日本語ロケールを積んでいる環境でテストした方がよいかもしれません。
最後に一言・・・
「認めたくないものだな、自分自身の若さゆえの過ちというものを」
実は、このエントリ、↑の名言を言いたいだけです ^^;
