時間をミリ単位で保持するlong
値「値」があり、システムのタイムゾーンを変更すると、異なる結果UTC +2:00
が返されます!UTC +13:00
new Date(value)
タイムゾーンが異なっていても、指定された値に対して同じ日付を返す理由と方法を教えてもらえますか?
時間をミリ単位で保持するlong
値「値」があり、システムのタイムゾーンを変更すると、異なる結果UTC +2:00
が返されます!UTC +13:00
new Date(value)
タイムゾーンが異なっていても、指定された値に対して同じ日付を返す理由と方法を教えてもらえますか?
いいえ、別の結果Date
は返されません。Date
ミリ秒単位の時間の単なるラッパーであり、それ以上のものではありません。タイムゾーン、時間などを本当に理解していません。
でも!Date.toString()
現在のタイムゾーンでグレゴリオ暦を使用して日付を印刷します。しかし、タイム ゾーンが異なっていても、同じ時点を表しています。
次の簡単なプログラムがあるとします。
new Date(1352296028515L).toString()
通常、印刷されます(私はCETタイムゾーンに住んでいます):
Wed Nov 07 14:47:08 CET 2012
しかし、タイム ゾーン ( -Duser.timezone=EST
) をオーバーライドするか、ニューヨークでプログラムを実行して、次のように取得できます。
Wed Nov 07 08:47:08 EST 2012
でも!両方の日付が実際には同じ時間、13:47 UTC を表していることに注意してください。
簡単に言えば、落ち着いてください。すべて問題ありませんjava.util.Date
。
クラスjava.util.Date
自体はタイムゾーンについて何も知りません。これは、1970 年 1 月 1 日 00:00:00 GMT からのミリ秒数のコンテナです。
単純に (明示的または暗黙的に)Date
オブジェクトを呼び出してオブジェクトを出力すると、日付はマシンが設定されているタイムゾーンにフォーマットされます。toString()
マシンを別のタイムゾーンに設定すると、印刷される日付は異なって見えますが、それでも同じ時点を指しています。
オブジェクトの値をDate
特定のタイム ゾーンで出力する場合は、SimpleDateFormat
オブジェクトを使用して、そのオブジェクトにタイム ゾーンを設定します。
Date date = ...;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
// Show the date in the UTC timezone
df.setTimeZone(TimeZone.getTimeZone("UTC"));
System.out.println(df.format(date));
それがタイムゾーンの仕組みです。たとえば、東部では 8:46、カリフォルニアでは 5:46 です。この方法でタイム ゾーンを処理する方法は、すべてを中央サーバーに基づいて作成することです。サーバーは GMT を使用することをお勧めします。次に、「真の」タイムゾーンが何であるかについて、ユーザーから好みを取得します。
Java の Calendar / Date クラスを使用しないようにしてください。Joda Timeを使用することを強くお勧めします。よく考えられており、バグがありません。
ところで、コードに問題はありません。現在の TimeZone に応じて結果が異なるだけです。