2

時間をミリ単位で保持するlong値「値」があり、システムのタイムゾーンを変更すると、異なる結果UTC +2:00が返されます!UTC +13:00 new Date(value)

タイムゾーンが異なっていても、指定された値に対して同じ日付を返す理由と方法を教えてもらえますか?

4

4 に答える 4

4

いいえ、別の結果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

于 2012-11-07T13:44:14.377 に答える
1

クラス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));
于 2012-11-07T13:45:20.107 に答える
0

それがタイムゾーンの仕組みです。たとえば、東部では 8:46、カリフォルニアでは 5:46 です。この方法でタイム ゾーンを処理する方法は、すべてを中央サーバーに基づいて作成することです。サーバーは GMT を使用することをお勧めします。次に、「真の」タイムゾーンが何であるかについて、ユーザーから好みを取得します。

于 2012-11-07T13:47:56.920 に答える
0

Java の Calendar / Date クラスを使用しないようにしてください。Joda Timeを使用することを強くお勧めします。よく考えられており、バグがありません。

ところで、コードに問題はありません。現在の TimeZone に応じて結果が異なるだけです。

于 2012-11-07T13:48:44.510 に答える