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


Автор: Firex 25.12.2012, 20:37
Собственно после установки вин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]]


Кто-нибудь сталкивался с таким/может подсказать что делаю не правильно?

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

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

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

Автор: Firex 26.12.2012, 11:49
Получается, что по дефорлту у меня в каледаре стоит Азия, и эта таймзона не меняется. setTimeZone ничего не делает. Раньше по-моему работало. Я хочу получить дату и время, которые стоят на моей системе. Т.е. Europe/Minsk timezone. И, желательно, что бы моя таймзона бралась по дэфолту при вызове Calendar.getInstance(), т.е. таймзона системы.

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

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


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

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

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

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

Автор: LSD 26.12.2012, 15:09
Цитата(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");

Автор: Firex 26.12.2012, 21:21
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

Что-то не работает.

Автор: dorogoyIV 26.12.2012, 22:27
Код

  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);

Автор: Firex 26.12.2012, 23:06
Спасибо, господа, за уделённое время, проблема по-моему найдена.
Всё дело в кривой 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()));

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

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