6

私は時間の処理を理解しようとしていますが、Java で何かを見つけて、やや困惑しました。次のサンプル コードを使用します。

public static void main(String[] args)
{
    //Calendar set to 12:00 AM of the current day (Eastern Daylight Time)
    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT-4"));
    cal.set(Calendar.HOUR_OF_DAY, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);
    /////

    //Calendar set to 12:00 AM of the current day (UTC time)
    Calendar utcCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    utcCal.set(Calendar.HOUR_OF_DAY, 0);
    utcCal.set(Calendar.MINUTE, 0);
    utcCal.set(Calendar.SECOND, 0);
    utcCal.set(Calendar.MILLISECOND, 0);
    /////

    long oneHourMilliseconds = 3600000;
    System.out.println((cal.getTimeInMillis() - utcCal.getTimeInMillis()) / oneHourMilliseconds);
}

cal2 つの形式のうちの 1 つを取ることによって表される時間を計算するためのアルゴリズムを視覚化します。

  1. エポックからミリ秒数を計算し、オフセットを追加 (-4 を追加)
  2. (エポック + オフセット) からミリ秒数を計算します。したがって、( Epoch - 4 * oneHourMilliseconds) からのミリ秒数。

これらのアルゴリズムは両方とも、 の結果より 4 時間遅れて結果を生成するはずですがutcCal、コードを実行すると が返されます4

の 4 時間後calタイムゾーンに設定されているにもかかわらず、 utcCalの 4 時間後のミリ秒値になる理由を誰かが説明できますか? コードが返されるべきではありませんか?utcCal-4

4

3 に答える 3

11

それは不幸な歴史の一部です。IDが「GMT-4」のタイムゾーンは、「UTC + 4」と予想されるものです。つまり、UTCより4時間進んでいます。

tzdbのetceteraファイルから:

# We use POSIX-style signs in the Zone names and the output abbreviations,
# even though this is the opposite of what many people expect.
# POSIX has positive signs west of Greenwich, but many people expect
# positive signs east of Greenwich.  For example, TZ='Etc/GMT+4' uses
# the abbreviation "GMT+4" and corresponds to 4 hours behind UTC
# (i.e. west of Greenwich) even though many people would expect it to
# mean 4 hours ahead of UTC (i.e. east of Greenwich).

そして、この同様の説明から:

管理できる場合は、GMTタイムゾーンの定義と使用を避けてください...

于 2012-04-18T14:49:50.857 に答える
2

カレンダーはtimezone にcal設定されています。2012-04-18 00:00:00GMT-4

その瞬間は in に対応し2012-04-18 04:00:00ますUTC(つまり、タイムゾーン の午前 12 時は、 のGMT-4午前 4 時ですUTC)。

カレンダーはtimezone にutcCal設定されています。2012-04-18 00:00:00UTC

2012-04-18 04:00:00との差2012-04-18 00:00:00は 4 時間なので、4 が印刷されていることがわかります。

于 2012-04-18T14:53:51.893 に答える
0
于 2018-02-28T22:41:44.250 に答える