2012年12月5日水曜日

【Android】SimpleDateFormatのタイムゾーンに注意


日時を文字列で取得する際にハマったこと.

日時を文字列で取得する際に
SimpleDateFormatクラスを使うことが多いと思う.

SimpleDateFormatクラスではフォーマットを指定して,時刻情報を与えてやると
フォーマットに合わせて整形された時刻情報が文字列で取得できる.

そこでよく使われるRFC1123形式と呼ばれる
Wed, 21 Jan 2009 10:09:52 GMT+09:00
こういったフォーマットのデータを取得したいとする.

そのためのフォーマット情報が
DateUtilsクラスにパターンが既に用意されている.

String org.apache.http.impl.cookie.DateUtils.PATTERN_ASCTIME = "EEE MMM d HH:mm:ss yyyy"
String org.apache.http.impl.cookie.DateUtils.PATTERN_RFC1036 = "EEEE, dd-MMM-yy HH:mm:ss zzz"
String org.apache.http.impl.cookie.DateUtils.PATTERN_RFC1123 = "EEE, dd MMM yyyy HH:mm:ss zzz"

この3つがあるようだ.
至れり尽くせりである.

つまりこんなかんじでLong値ミリ秒UNIXタイムデータをRFC1123形式の文字列に変換できる.


ここまでは特に問題ないと思っていた.
というか,結果の文字列をUIに表示させるだけなら問題ない.
しかし,複数機器を跨いでフォーマット情報をキーに変換を行う場合問題が起こることがある.


上記のソースを使用して複数端末に時間情報を喰わせる.
すると機種依存かAndroidバージョン依存かは知らんが違うフォーマットで返ってくることがある.

欲しいのは
Wed, 21 Jan 2009 10:09:52 GMT+09:00
こういうフォーマットである.
しかし,一部機種で
Wed, 05 Dec 2012 09:48:26 JST
こんな情報が返ってきた.
タイムゾーンの表示がちがう.

UIに表示させるだけなら問題ないが,
連携する機器が【JST】を理解できなければそれはエラーである.


サーバーがGMT基準しか受け付けない場合
なおかつタイムゾーンがそんなに重要でない場合は

ハードコーディング.
こんなかんじでやっつけても大丈夫だと思う.

0 件のコメント:

コメントを投稿