4

次のコードを検討してください。

Time time1 = new Time("America/Los_Angeles"); // UTC -8
Time time2 = new Time("Pacific/Kiritimati");  // UTC +14

time1.setToNow();
time2.setToNow();

Log.d("timetest", "America/Los_Angeles: " + time1.toMillis(false));
Log.d("timetest", "Pacific/Kiritimati : " + time2.toMillis(false));

出力されるログは次のとおりです。

08-03 07:27:50.687: D/timetest(28411): America/Los_Angeles: 1375540070000
08-03 07:27:50.687: D/timetest(28411): Pacific/Kiritimati : 1375540070000

ご覧のとおり、ミリ秒の値は同じですが、タイム ゾーンにより完全に 22 時間ずれています。これにより、の指定されたタイム ゾーンTime.toMillis(boolean)ではなく、UTC に基づいていると思われます。のタイムゾーンTimeに基づいてミリ秒を取得する方法が必要です。Time何か案は?

4

2 に答える 2

5

エポック 1 1970 年 1 月 00:00:00 UTC からの経過ミリ秒数はどこでも同じです。現在ロサンゼルスにいるかキリチマティにいるかは関係ありません。


編集

このtoMillisメソッドは、エポックからのミリ秒数を返します。エポックは 1970 年 1 月 1 日 00:00:00 UTC です。

このように考えてみてください。Aさんがロサンゼルス生まれで、Bさんがキリティマティ生まれだとするtime1.toMillis()と、Aさんの年齢は で、Bさんの現在の年齢はtime2.toMillis()ですよね?

UTC タイムゾーンでは生まれたときは真夜中でしたが、それぞれのタイムゾーンでは真夜中ではありませんでした。これは、タイムゾーンが UTC-8 と UTC+14 であることからわかります。

time1.toMillis() != time2.toMillis()2 人のうちの 1 人が年上であることを意味する場合。それは、彼が人生でより多くのミリ秒を生きたことを意味します。もちろん、私たちが言ったように、彼らは同時に生まれたので、これは当てはまりません. それが、あなたが見ている出力が正しい理由であり、それを変更しようとするべきではないと私は信じています.

于 2013-08-03T14:39:48.510 に答える
0

Time.gmtoffUTC オフセットを秒単位で含む whichを使用して計算しました。

Time time1 = new Time("America/Los_Angeles"); // UTC -8
Time time2 = new Time("Pacific/Kiritimati");  // UTC +14

time1.setToNow();
time2.setToNow();

Log.d("timetest", "America/Los_Angeles: " + (time1.toMillis(false) - (time1.gmtoff * 1000)));
Log.d("timetest", "Pacific/Kiritimati : " + (time2.toMillis(false) - (time2.gmtoff * 1000)));

結果のログ:

08-03 07:53:04.866: D/timetest(31414): America/Los_Angeles: 1375566784000
08-03 07:53:04.866: D/timetest(31414): Pacific/Kiritimati : 1375491184000
于 2013-08-03T14:56:42.877 に答える