2016-04-01 13 views
0

Iは、人間が読める形式にGPS位置のタイムスタンプを変換するために、次のコードを使用:the docs 1としてAndroidのString.format()はタイムゾーン対応ですか?

String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", location.getTime()) 

、GPS位置のタイムスタンプがUTCであるべきです。しかし、私が返す文字列は現地時間にあります(2つの異なるデバイスでテストされています)。

他の形式のString.format()を使用しようとしましたが、これは追加のLocale引数をとり、nullロケール(ドキュメントごとに「ローカリゼーションなし」を意味します)を渡します。 (Localeのドキュメントにはタイムゾーンはまったく記載されていないので、ここではロケールは問題ではないと思われます)。

私の他の疑問は、GPSスタックがUTCではなく現地時間を指定したとおりに動作しない可能性があるということでした。私はエポックプラスCETのためにタイムゾーンのオフセット(デバイスのタイムゾーン)の始まりである

1970-01-01 01:00:00 

を返し

String.format("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS", (long) 0) 

でこれをテストしました。オフセットは明らかにString.format()によって追加されます。

String.format()はタイムゾーン変換を行う予定ですか?この動作にどのような影響を与えることができますか?つまり、コンバージョンの対象となるタイムゾーンを選択するか、コンバージョンを完全に抑制しますか?

答えて

1

String.formatは、デフォルトのタイムゾーンでの日付/時刻を表します。 UTCに書式設定するには、明示的に使用したい時間帯を設定することができます代わりにSimpleDateFormat、使用:ところで

String formatInUtc(long millis) { 
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ROOT); 
    df.setTimeZone(TimeZone.getTimeZone("UTC")); 
    return df.format(new Date(millis)); 
} 

E. gを:

System.out.println(formatInUtc(0L)); // 1970-01-01 00:00:00 

を、ロケールおよびタイムゾーンは直交しています物事:ロケールはテキスト表現(数字、記号、セパレータ、言語)の側面を決定し、タイムゾーンはクロックがUTCからどのようにシフトするかを決定します。

1

String.formatはタイムゾーンを認識していません。 Joda時間ライブラリを使用してください。ライブラリのdatetime zoneおよびdatetimeformatクラスを使用すると、タイムゾーンに対応するdatetimeを書式設定できます。それを行う方法については、オンラインでたくさんの例を得ることになるので、ここで詳しく説明しません。 :)

+0

'String.format()'がタイムゾーンを完全に認識していなかったなら、 '0L => 1970-01-01 00:00:00'と期待していましたが、明らかに、 UTCで入力し、出力を現地時間としてフォーマットします。欠けているものは、その処理に影響する方法です。私は 'DateFormat'を使って簡単に入手でき、本当にシンプルなので終わりました。 – user149408

関連する問題