Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Непонятная работа TimeZone


Автор: FlakeMusic 28.9.2009, 11:49
Здравствуйте.

Есть код:
Код

TimeZone tz = TimeZone.getTimeZone("GMT+06:00");
Calendar cal = Calendar.getInstance(tz);
System.out.println(cal.get(Calendar.HOUR));


Дата на компьютере выставлена, например, 28 сетнября.
Выполнение кода показывает "2"

Далее меняю дату на ноябрь, показывает "3".

Я не могу понят логики. У меня же жёстко задана зона, почему тогда меняется время.
И ещё даже если учитывается летнее время, то почему на час больше в зимний период? Должно же быть наоборот.

Автор: LSD 28.9.2009, 17:23
Это было неправильное предположение.

Автор: FlakeMusic 28.9.2009, 21:13
Что-то я ответа на вопрос не нашёл.
Почему в зимний период показывается на час больше? Должно быть наоборот.

Автор: LSD 29.9.2009, 11:14
Цитата(FlakeMusic @  28.9.2009,  11:49 Найти цитируемый пост)
Далее меняю дату на ноябрь

А время на час назад переводишь?

Автор: FlakeMusic 29.9.2009, 15:17
Цитата(LSD @ 29.9.2009,  11:14)
А время на час назад переводишь?

Нет. Вот сейчас проверил. Как было 16:16, так и остаётся.

Автор: LSD 29.9.2009, 19:08
Вот в этом походу и есть проблема. Ты перевел дату, а часы не перевел. Т.е. у тебя уже вроде того как должно быть зимнее время (GMT+3), а часы показывают летнее (GMT+4).
Предположим что у тебя сейчас 12 часов, значит по Гринвичу сейчас 8, а в GMT+06:00 сейчас 14. В твоем же случае у тебя 12, система считает, что у тебя уже зимнее время и значит по Гринвичу сейчас 9 часов, и значит GMT+06:00 сейчас 15 часов.

Запусти и посмотри что выдаст:
Код

  public static final SimpleDateFormat isoDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z (Z)");

  public static void main(String[] args) throws Exception
  {
    Date now = new Date();

    TimeZone defaultTimeZone = TimeZone.getDefault();
    printTimeZoneInfo(defaultTimeZone);
    printTime(defaultTimeZone, now);

    TimeZone tz = TimeZone.getTimeZone("GMT+06:00");
    printTimeZoneInfo(tz);
    printTime(tz, now);
  }

  private static void printTimeZoneInfo(TimeZone defaultTimeZone)
  {
    System.out.println("Name = " + defaultTimeZone.getDisplayName());
    System.out.println("DST Saving = " + defaultTimeZone.getDSTSavings());
    System.out.println("RawOffset = " + defaultTimeZone.getRawOffset());
    System.out.println("Offset(now) = " + defaultTimeZone.getOffset(System.currentTimeMillis()));
    System.out.println();
  }

  private static void printTime(TimeZone timeZone, Date time)
  {
    isoDateFormat.setCalendar(Calendar.getInstance(timeZone));
    System.out.println(isoDateFormat.format(time));
    System.out.println();
  }

Автор: FlakeMusic 29.9.2009, 21:04
Вот результат.

Код

Name = Moscow Standard Time
DST Saving = 3600000
RawOffset = 10800000
Offset(now) = 10800000

2009-11-29 22:03:26 MSK (+0300)

Name = GMT+06:00
DST Saving = 0
RawOffset = 21600000
Offset(now) = 21600000

2009-11-30 01:03:26 GMT+06:00 (+0600)

Автор: LSD 30.9.2009, 10:58
Как я и думал. Судя по тому что у тебя RawOffset равен Offset(now), Java считает что сейчас у тебя уже зимнее время. А значит время возвращаемое System.currentTimeMillis() на один час больше, отсюда и лишний час.

Можешь сам убедится.
Код

TimeZone utc = TimeZone.getTimeZone("UTC");
printTimeZoneInfo(utc);
printTime(utc, now);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)