Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятная работа TimeZone 
:(
    Опции темы
FlakeMusic
Дата 28.9.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.3.2008

Репутация: нет
Всего: 1



Здравствуйте.

Есть код:
Код

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


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

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

Я не могу понят логики. У меня же жёстко задана зона, почему тогда меняется время.
И ещё даже если учитывается летнее время, то почему на час больше в зимний период? Должно же быть наоборот.
PM MAIL   Вверх
LSD
Дата 28.9.2009, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Это было неправильное предположение.

Это сообщение отредактировал(а) LSD - 29.9.2009, 19:09


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
FlakeMusic
Дата 28.9.2009, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.3.2008

Репутация: нет
Всего: 1



Что-то я ответа на вопрос не нашёл.
Почему в зимний период показывается на час больше? Должно быть наоборот.
PM MAIL   Вверх
LSD
Дата 29.9.2009, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
FlakeMusic
Дата 29.9.2009, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.3.2008

Репутация: нет
Всего: 1



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

Нет. Вот сейчас проверил. Как было 16:16, так и остаётся.
PM MAIL   Вверх
LSD
Дата 29.9.2009, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Вот в этом походу и есть проблема. Ты перевел дату, а часы не перевел. Т.е. у тебя уже вроде того как должно быть зимнее время (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();
  }



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
FlakeMusic
Дата 29.9.2009, 21:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 91
Регистрация: 18.3.2008

Репутация: нет
Всего: 1



Вот результат.

Код

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)

PM MAIL   Вверх
LSD
Дата 30.9.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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

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



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.