2017-02-19 4 views
0

Мой код:календарь в Java не работает UTC часовой пояс

TimeZone timeZone = TimeZone.getTimeZone("UTC"); 
Calendar cal = (Calendar) Calendar.getInstance(timeZone); 
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
System.out.println("Gregorian cal time:"+cal.getTime()); 
System.out.println("utc time: "+simpleDateFormat.format(cal.getTime())); 

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

+2

И почему они не должны? вы форматируете ту же дату ('cal.getTime()'), используя тот же (по умолчанию) часовой пояс. Так что это нормально, чтобы получить тот же результат. Чего вы пытаетесь достичь? –

+0

Но, я хочу время UTC. Поскольку я упоминал часовой пояс, он должен показывать время UTC. –

+0

Единственное отличие между вашими заявлениями печати состоит в том, что один из них получает некоторое строковое форматирование - ничего о дате фактически не изменилось. – csmckelvey

ответ

0
LocalDateTime utc_time = LocalDateTime.now(ZoneId.of("UTC")); 
System.out.println("Date: "+utc_time); 

работает отлично

+0

Вопрос запрашивает значение в UTC. Итак, использование ['LocalDateTime'] (https://docs.oracle.com/javase/8/docs/api/java/time/LocalDateTime.html) здесь неверно **, поскольку цель этого класса намеренно иметь * no * смещение или часовой пояс. По определению, «LocalDateTime» не может быть в UTC. «LocalDateTime» - это даже не фактический момент, это * не * точка на временной шкале. Ваше имя переменной 'LocalDateTime utc_time' является противоречием в терминах. –

1

Вы должны установить TimeZone вашего DateFormatter в "UTC"

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EE MMM dd HH:mm:ss zzz yyyy", Locale.US); 
simpleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println("utc time: "+simpleDateFormat.format(cal.getTime())); 
0

Tl; дг

Instant.now() 

Избегайте классов наследство даты и времени

Вы используете неприятные старые классы времени, теперь устаревшие, вытесненные классами java.time. Унаследованные классы - ужасный беспорядок, плохо спроектированный, запутанный и ошибочный. Избежать их.

Instant

Instant класс представляет момент на временной шкале в UTC с разрешением nanoseconds (до девяти (9) цифр десятичной дроби).

Instant instant = Instant.now(); 

instant.toString(): 2017-02-23T03: 30: 58.431Z

Формат этой строки, генерируемого toString является стандартным форматом ISO 8601. Z на конце короткий для Zulu и означает UTC.

Все, все готово.

ZonedDateTime

Если вы хотите увидеть тот же момент, что и wall-clock time некоторой конкретной области, а затем применить ZoneId получить ZonedDateTime.

Указать proper time zone name в формате continent/region, такие как America/Montreal, Africa/Casablanca или Pacific/Auckland. Никогда не используйте аббревиатуру 3-4 буквы, такую ​​как EST или IST, так как они не настоящие часовые пояса, не стандартизированные, и даже не уникальные (!).

ZoneId z = ZoneId.of("Asia/Kolkata"); 
ZonedDateTime zdt = instant.atZone(z); 

zdt.toString(): 2017-02-23T09: 00: 58,431 + 05: 30 [Азия/Калькутта]

Индия пять с половиной часов больше, чем в UTC. Поэтому, когда настроен на часовой пояс Asia/Kolkata, обратите внимание, как время суток перескакивает от 03:30 до 09:00.


О java.время

Рамка java.time встроена в Java 8 и более поздних версий. Эти классы вытесняют неприятные старые legacy классы времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, в настоящее время в maintenance mode, советует перейти на классы java.time.

Чтобы узнать больше, см. Oracle Tutorial. И поиск Stack Overflow для многих примеров и объяснений. Спецификация: JSR 310.

Где получить классы java.time?

  • Java SE 8 и SE 9, а затем
    • Встроенный.
    • Часть стандартного Java API с объединенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и SE 7
    • Большая часть функциональности java.time будет обратно портирован на Java 6 & 7 в ThreeTen-Backport.
  • Android

Проект ThreeTen-Extra расширяет java.time с дополнительными классами. Этот проект является доказательством возможных будущих дополнений к java.time. Здесь вы можете найти полезные классы, такие как Interval, YearWeek, YearQuarter, andfz more.

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