Календарь Java :Почему смещения UTC меняются местами?

Я пытаюсь разобраться с обработкой времени -и наткнулся на кое-что в 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);
}

Я визуализирую алгоритм расчета времени, представленный calпринимающий 1 из 2 форм:

  1. Вычислить количество миллисекунд от эпохи, добавить смещение (добавить -4)
  2. Вычислите количество миллисекунд из (Epoch + offset ). Итак, #миллисекунд из(Epoch - 4 * oneHourMilliseconds).

Оба этих алгоритма должны давать результат, который на 4 часа отстает от utcCal, однако запуск кода возвращает 4.

Может ли кто-нибудь объяснить мне, почему cal, несмотря на то, что он установлен в часовой пояс на 4 часа отстает от utcCal, в конечном итоге имеет значение миллисекунды на 4 часа позже, чем utcCal ? Разве код не должен возвращать -4?

5
задан Kevin 18 April 2012 в 14:41
поделиться