Преобразование часового пояса Java Calendar в проблему GMT - PullRequest
1 голос
/ 22 июля 2011

У меня есть один объект Calendar, соответствующий часовому поясу пользователя, который может быть PST и т. Д., Теперь я хочу преобразовать его в GMT и сохранить время, т. Е. Изначально был установлен календарь @ 00:00:00 в PSTего следует преобразовать в 08:00:00 после преобразования с учетом разницы времени / даты.Может ли кто-нибудь оказать мне некоторую помощь по этому вопросу.

Заранее признателен за помощь.

Спасибо,

Вайбхав

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

Просто создайте новый календарь в GMT, установите время в этом календаре на то же, что и в исходном календаре, и все готово:

gmtCalendar.setTime(userCalendar.getTime());

Это должно быть хорошо, как getTime()call возвращает instant во времени (т. е. java.util.Date без ассоциированного часового пояса).

Как всегда, если вы выполняете значительный объем работы с датой / временем на Javaвам следует рассмотреть возможность использования Joda Time .

0 голосов
/ 20 февраля 2018

ТЛ; др

( ( GregorianCalendar ) myCal )  // Cast from a general `Calendar`  to  specific subclass `GregorianCalendar`. 
    .toZonedDateTime()           // Convert from troublesome legacy class to modern java.time class, `ZonedDateTime`.
    .toInstant()                 // Extract a UTC-specific value, an `Instant` object.

java.time

Современный подход использует java.time классы.

Преобразуйте ваш устаревший Calendar объект (если GregorianCalendar) в ZonedDateTime. Вызовите новые методы преобразования, добавленные к старым классам.

GregorianCalendar gc = ( GregorianCalendar ) myCal ;
ZonedDateTime zdt = gc.toZonedDateTime() ;

Теперь извлеките Instant, значение всегда в UTC. Вы можете думать об этом следующим образом: ZonedDateTime = (Instant + ZoneId)

Instant instant = zdt.toInstant() ;

Для большей гибкости, такой как создание строк в различных форматах, преобразуйте в объект OffsetDateTime.

OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC ) ;

О java.time

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

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

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

Используя драйвер JDBC , совместимый с JDBC 4.2 или более поздней версией, вы можете напрямую обмениваться объектами java.time с вашей базой данных. Нет необходимости ни в строках, ни в java.sql. * Классах.

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

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

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

...