2012-06-14 4 views
6

У меня есть странные проблемы с Java григорианским календарем:Java GregorianCalendar Timezone

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:S Z"); 
sdf.setTimeZone(TimeZone.getTimeZone("US/Pacific")); 

GregorianCalendar cal1 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific")); 
cal1.setTimeInMillis(1320566400000L); 

GregorianCalendar cal2 = new GregorianCalendar(TimeZone.getTimeZone("US/Pacific")); 
cal2.setTimeInMillis(1320570000000L); 

System.out.println(sdf.format(cal1.getTime())); 
System.out.println(sdf.format(cal2.getTime())); 

я выполнил выше приведенный код на машине с по умолчанию часового пояса = US Pacific, но машина работает в Германии.

В результате получается следующее:

2011-11-06 01:00:00:0 -0700 
2011-11-06 01:00:00:0 -0800 

Я действительно не понимаю, почему есть другой часовой пояс, в результате ... Я также проверил код на другом компьютере (по умолчанию Timezone = GMT) и он работает правильно.

У кого-нибудь есть идея, почему эта проблема возникает?

Бест, Майкл

+0

В какой версии Java вы использовали? ;-) Иногда в одной версии есть ошибки, а не в других. – reporter

+0

Я использую Java 1.6. – Michael

ответ

5

Добавьте эти строки в программе:

for (int i=0; i<24; i++) { 
    cal1.add(Calendar.MINUTE, i*5); 
    System.out.println(" : " + sdf.format(cal1.getTime())); 
} 

И вы увидите:

: 2011-11-06 01:00:00:0 -0700 
: 2011-11-06 01:05:00:0 -0700 
: 2011-11-06 01:15:00:0 -0700 
: 2011-11-06 01:30:00:0 -0700 
: 2011-11-06 01:50:00:0 -0700 
: 2011-11-06 01:15:00:0 -0800 
: 2011-11-06 01:45:00:0 -0800 
: 2011-11-06 02:20:00:0 -0800 
: 2011-11-06 03:00:00:0 -0800 

Кажется, вы меняете летнее время на зимнее время. Мой часовой пояс - CET (UTC + 01: 00), поэтому я не могу сказать, почему он работает на вашей второй машине.

+0

Спасибо за информацию с летним временем. В Германии изменение летнего времени - неделя спустя - поэтому я об этом не думал :) – Michael

2

6 ноября 2011 года, когда в США закончилось летнее время. Итак, что вы видите, это часовой удар 2am 6-го ноября, а затем он возвращается к 1 часам, чтобы вернуться назад к стандартному времени. Таким образом, смещение также изменяется от -7 до -8 от GMT, которое я считаю для тихоокеанского времени. Поэтому он работает правильно, что я вижу.

0

Пожалуйста, проверьте на панели управления, что вы не активировали время лета. Эта ошибка может быть из-за этого

Смежные вопросы