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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bug JVM & Windows 7? Calendar не изменяет timezone 
V
    Опции темы
Firex
Дата 25.12.2012, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Собственно после установки вин7 и jre7 обнаружилось следующее:
Код

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));
SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy hh:mm");
System.out.println(df.format(c.getTime()));
System.out.println(c.getTimeZone());
c.setTimeZone(TimeZone.getTimeZone("GMT+5"));
System.out.println(df.format(c.getTime()));
System.out.println(c.getTimeZone());
System.out.println(df.format(Calendar.getInstance().getTime()));
System.out.println(Calendar.getInstance().getTimeZone());

Имеет вот такой вывод:
Цитата

26.12.2012 04:23
sun.util.calendar.ZoneInfo[id="GMT+01:00",offset=3600000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
26.12.2012 04:23
sun.util.calendar.ZoneInfo[id="GMT+05:00",offset=18000000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
26.12.2012 04:23
sun.util.calendar.ZoneInfo[id="Asia/Magadan", offset=39600000, dstSavings=3600000, useDaylight=true, transitions=118, lastRule=java.util.SimpleTimeZone[id=Asia/Magadan, offset=39600000, dstSavings=3600000, useDaylight=true, startYear=0, startMode=2, startMonth=2, startDay=-1, startDayOfWeek=1, startTime=7200000, startTimeMode=1, endMode=2, endMonth=9, endDay=-1, endDayOfWeek=1, endTime=7200000, endTimeMode=1]]


Кто-нибудь сталкивался с таким/может подсказать что делаю не правильно?
PM MAIL   Вверх
LSD
Дата 26.12.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Firex @  25.12.2012,  21:37 Найти цитируемый пост)
Кто-нибудь сталкивался с таким/может подсказать что делаю не правильно?

Основная ошибка в том, что ты так и не сказал, что ты пытаешься получить.

Подозреваю, что тебе надо у DateFormat вызывать setCalendar(). Плюс надо понять один простой момент, что Java time это количество миллисекунд прошедших с 01.01.1970 00:00:00.000 UTC, Java time не содержит в себе таймзону. Таймзону содержит календарь и используется она чтобы из этих миллисекунд, получить часы, минут, дни и т.д.


--------------------
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   Вверх
Firex
Дата 26.12.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Получается, что по дефорлту у меня в каледаре стоит Азия, и эта таймзона не меняется. setTimeZone ничего не делает. Раньше по-моему работало. Я хочу получить дату и время, которые стоят на моей системе. Т.е. Europe/Minsk timezone. И, желательно, что бы моя таймзона бралась по дэфолту при вызове Calendar.getInstance(), т.е. таймзона системы.
PM MAIL   Вверх
LSD
Дата 26.12.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Firex @  26.12.2012,  12:49 Найти цитируемый пост)
Получается, что по дефорлту у меня в каледаре стоит Азия, и эта таймзона не меняется. setTimeZone ничего не делает.

Все меняется, просто ты посмотри у кого ты вызываешь setTimeZone().


Цитата(Firex @  26.12.2012,  12:49 Найти цитируемый пост)
Я хочу получить дату и время, которые стоят на моей системе. Т.е. Europe/Minsk timezone. И, желательно, что бы моя таймзона бралась по дэфолту при вызове Calendar.getInstance(), т.е. таймзона системы. 

Именно так и происходит. Если у тебя по умолчанию используется какая-то левая зона, это значит ты ее переопределил.


--------------------
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   Вверх
Firex
Дата 26.12.2012, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(LSD @  26.12.2012,  11:52 Найти цитируемый пост)
Именно так и происходит. Если у тебя по умолчанию используется какая-то левая зона, это значит ты ее переопределил.

Хорошо, а когда я явно в метод getInstance календаря передаю TimeZone.getTimeZone("GMT+1"), не должно ли возвращаться время в таймзоне GMT+1, даже если дэфолтная таймзона Азия ? И тогда ещё вопрос, как переопределить обратно? )
Т.е. что бы при вызове getInstance() мне возвращался календарь сегодняшнего дня в зоне Europe/Minsk.
PM MAIL   Вверх
LSD
Дата 26.12.2012, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(Firex @  26.12.2012,  15:40 Найти цитируемый пост)
Хорошо, а когда я явно в метод getInstance календаря передаю TimeZone.getTimeZone("GMT+1"), не должно ли возвращаться время в таймзоне GMT+1, даже если дэфолтная таймзона Азия ? И тогда ещё вопрос, как переопределить обратно? )
Т.е. что бы при вызове getInstance() мне возвращался календарь сегодняшнего дня в зоне Europe/Minsk. 

Именно так и происходит. Еще раз:
Цитата(LSD @  26.12.2012,  11:13 Найти цитируемый пост)
Плюс надо понять один простой момент, что Java time это количество миллисекунд прошедших с 01.01.1970 00:00:00.000 UTC, Java time не содержит в себе таймзону. Таймзону содержит календарь и используется она чтобы из этих миллисекунд, получить часы, минут, дни и т.д. 

Между DateFormat и калнедарем передается именно Java time. Поэтому вывод DateFormat ником образом не аффектится таймзоной календаря. Исправь код:
Код

SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy hh:mm z");



--------------------
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   Вверх
Firex
Дата 26.12.2012, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



smile 
Код

Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+1"));
SimpleDateFormat df = new SimpleDateFormat("dd.MM.yyyy hh:mm z");
System.out.println(df.format(c.getTime()));
System.out.println(c.getTimeZone());
c.setTimeZone(TimeZone.getTimeZone("GMT+5"));
System.out.println(df.format(c.getTime()));
System.out.println(c.getTimeZone());
System.out.println(df.format(Calendar.getInstance().getTime()));
System.out.println(Calendar.getInstance().getTimeZone());


вывод:
Код

27.12.2012 05:15 MAGT
sun.util.calendar.ZoneInfo[id="GMT+01:00",offset=3600000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
27.12.2012 05:15 MAGT
sun.util.calendar.ZoneInfo[id="GMT+05:00",offset=18000000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null]
27.12.2012 05:15 MAGT
sun.util.calendar.ZoneInfo[id="Asia/Magadan",offset=39600000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Asia/Magadan,offset=39600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=7200000,startTimeMode=1,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=7200000,endTimeMode=1]]


Что нужно сделать, что бы по дэфолту время выводилось во временной зоне моей системы(Europe/Minsk) ? smile

Добавлено через 14 минут и 9 секунд
Код

System.out.println(Calendar.getInstance().getTime());
System.out.println(Calendar.getInstance(TimeZone.getTimeZone("Europe/Minsk")).getTime());

и вывод:
Код

Thu Dec 27 05:34:16 MAGT 2012
Thu Dec 27 05:34:16 MAGT 2012

Что-то не работает.
PM MAIL   Вверх
dorogoyIV
Дата 26.12.2012, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 3
Всего: 46



Код

  TimeZone tz = TimeZone.getTimeZone("GMT+5:00");
  Calendar c = Calendar.getInstance(tz, new Locale("ru", "RU"));

  int hour = c.get(Calendar.HOUR);
  int minute = c.get(Calendar.MINUTE);

  System.out.println(hour + " " + minute);

PM MAIL   Вверх
Firex
Дата 26.12.2012, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо, господа, за уделённое время, проблема по-моему найдена.
Всё дело в кривой IDE - STS 2.9, в STS 3.1 по-моему работает как и должно быть.

Да, однозначно, в 3.1 работает как и положено.
Код

Calendar c = Calendar.getInstance();
DateFormat df = new SimpleDateFormat("dd.MM.yyyy hh:mm");
System.out.println(df.format(c.getTime()));

Выводит то время, как и задумывалось - в таймзоне системы.

Это сообщение отредактировал(а) Firex - 26.12.2012, 23:14
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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