2014-10-18 3 views
0

Попытка распечатать время в разных часовых поясах с помощью GregorianCalendar, используя код ниже, но не работает. Любые идеи почему?Экземпляр календаря не работает

GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")).getTime(). Он печатает время в соответствии с моим часовым поясом, а не PST.

ответ

1

По дизайну java.util.Date будет инициализирован UTC миллисекундами с эпохи и, следовательно, не учитывает часовые пояса. Следующий код будет генерировать:

Calendar pstCalendar = GregorianCalendar.getInstance(TimeZone.getTimeZone("PST")); 
    Calendar defCalendar = GregorianCalendar.getInstance(TimeZone.getDefault()); 

    // Same values here : 
    System.out.println(pstCalendar.getTime()); 
    System.out.println(defCalendar.getTime()); 

    // Different values here : 
    System.out.println(pstCalendar.get(Calendar.HOUR_OF_DAY)); 
    System.out.println(defCalendar.get(Calendar.HOUR_OF_DAY)); 

Решение было бы не использовать метод GetTime непосредственно, но принимать во внимание Calendar.ZONE_OFFSET и взять диф перед преобразованием в объект даты:

Date d = new Date(); 

    // Default time : 
    System.out.println(d); 

    d.setTime(d.getTime() + pstCalendar.get(Calendar.ZONE_OFFSET)); 

    // Time after applying offset 
    System.out.println(d); 
+0

Чтобы изменить значение 'java.util.Date.getTime()' to * local * millis действительно очень плохая идея дизайна. Вы кодируете в противоположность спецификации, игнорируя спецификацию этого класса. Это просто грязный хак. –

1

Calendar#getTime() - Возвращает объект Date, представляющий значение времени этого календаря (миллисекундное смещение от эпохи). Точно значение в java.util.Date - это количество миллисекунд с эпохи Unix, которое произошло в полночь 1 января 1970 года, по часовой стрелке и java.util.Date не имеет определенного часового пояса.

с другой стороны, вы можете добиться того, что вы пытаетесь сделать, таким образом, также

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MMM-dd HH:mm:ss z"); 
sdf.setTimeZone(TimeZone.getTimeZone("PST")); 
System.out.println(sdf.format(new Date())); 
1

Избегайте j.u.Calendar

Классы java.util.Date и .Calendar, как известно, хлопотное и устаревшее. Избежать их. Вместо этого используйте Joda-Time или пакет java.time в Java 8 (вдохновленный Joda-Time).

В отличие от j.u.Date, объект даты в этих двух других библиотеках знает свой собственный назначенный часовой пояс.

Joda времени

Некоторые примеры кода в Joda-Time 2.5. Работа с часовыми поясами становится элементарной при использовании Joda-Time.

DateTime dateTimeDefaultZone = DateTime.now(); // The JVM’s current default time zone assigned. I recommend always specifying a zone instead of implicitly relying on default. 
DateTime dateTimeLosAngeles = dateTimeDefaultZone.withZone(DateTimeZone.forID("America/Los_Angeles")); 
DateTime dateatimeUtc = dateTimeDefaultZone.withZone(DateTimeZone.UTC); 
DateTime dateTimeKolkata = dateTimeDefaultZone.withZone(DateTimeZone.forID("Asia/Kolkata")); 

Time Zone Имена

Используйте proper time zone names. Избегайте этих 3 или 4 буквенных кодов, поскольку они не являются стандартизованными и не уникальными, и они путают проблему летнего времени.

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