Время Java в GMT - PullRequest
       6

Время Java в GMT

5 голосов
/ 18 августа 2011

У меня есть приложение Grails со следующим кодом:

Date now = Calendar.getInstance().getTime() //Also tried new Date()
println "now: " + now

Когда я делаю это, я получаю now: Thu Aug 18 12:47:09 CDT 2011. Мне нужно, чтобы дата была по Гринвичу, а не по местному времени, потому что мне нужно хранить время по Гринвичу в базе данных. Я могу использовать объект simpleDateFormat для распечатки времени по Гринвичу, но мне нужно сохранить его как GMT.

Вопрос: Как преобразовать объект Date в объект Date, используя GMT?

Ответы [ 8 ]

5 голосов
/ 18 августа 2011

Это подчеркивает, почему Java отстой во времени.Все предыдущие посты близки, но мы должны быть очень осторожны, чтобы узнать текущее время по Гринвичу и узнать текущее время в CDT и , позвонив по по Гринвичу.текущее время по Гринвичу с контекстом часового пояса по Гринвичу.

Для преобразования в объект Date, который сохраняет зону нетронутой, вам необходимо вызвать:

TimeZone.setDefault(reference);

Этот параметрдлиться до тех пор, пока ваша текущая JVM.Теперь вызов get Time должен дать желаемый результат.

myCal.getTime();
2 голосов
/ 18 августа 2011

Что ж, если вам действительно нужно время в Гринвиче, вам нужно указать его как Гринвичское время (@jpredham прав. Спасибо вам! Редактирую мой пост, чтобы отразить это)

Также сделайте следующее

//this option uses TimeZone
TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT");
TimeZone.setDefault(gmtTimeZone);
Calendar calendar = Calender.getInstance(gmtTimeZone);

Date myDate = calendar.getTime();
1 голос
/ 18 августа 2011

Попробуйте:

println Calendar.getInstance(TimeZone.getTimeZone('GMT')).format('HH:mm:ss')

Обратите внимание, что при преобразовании в дату информация о часовом поясе теряется.Когда Java / Groovy форматирует вашу дату для печати, она автоматически форматирует ее для вашего местного часового пояса.Не волнуйтесь, ваша дата не связана с часовым поясом.Вы можете добавить правильный часовой пояс обратно, когда отобразите его так:

Date now = Calendar.getInstance(TimeZone.getTimeZone('GMT')).time
def formatter = new java.text.SimpleDateFormat('HH:mm:ss')
formatter.timeZone = TimeZone.getTimeZone('GMT')
println formatter.format(now)
0 голосов
/ 17 февраля 2018

tl; др

Instant.now()    // Capture current moment in UTC.
    .toString()  // Generate a String object in standard ISO 8601 format, YYYY-MM-DDTHH:MM:SS.SSSSSSSSSZ.

2018-02-16T23: 28: 01.101324Z

java.time

В современном подходе используются java.time классы.Полностью избегайте утомительных устаревших классов даты и времени.

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

Instant instant = Instant.now() ;  // Capture the current moment in UTC.

Создайте строку в стандартном формате ISO 8601, вызвав toString.

String output = instant.toString() ;

Если вам требуется больше гибкости, чем обеспечивает Instant, например форматирование при генерации строк,используйте OffsetDateTime с константой ZoneOffset.UTC.

OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ;  // Capture the current moment in UTC.

Для генерации строк в нестандартных форматах используйте DateTimeFormatter.


О java.time

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

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

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: 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-Бэкпорт (упомянуто выше).См. Как использовать ThreeTenABP… .

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

0 голосов
/ 26 мая 2014

Вы путаете объект даты и времени с его строковым представлением.Все распространенные библиотеки даты и времени в Java (java.util.Date, Joda-Time, java.time в Java 8) внутренне отслеживают дробное число секунд с первого момента 1970 года в UTC, игнорируя при этом високосные секунды.Таким образом, во всех трех библиотеках дата-время внутренне всегда в UTC / GMT.

Так что ваш вопрос о том, как преобразовать объект Date в объект Date в GMT (UTC), не имеет смысла.

Две лучшие библиотеки (Joda-Time и java.time) также отслеживают часовой пояс внутри объекта даты и времени.Общеизвестно хлопотный java.util.Date не имеет назначенного часового пояса, но смущает применение текущего часового пояса JVM по умолчанию, когда вызывается его метод * 1007. *

DateTime nowUtc = DateTime.now( DateTimeZone.UTC );

При вызове метода toString этого объекта генерируется строка в формате ISO 8601 по времени Зулу (UTC).

Выполните поиск в StackOverflow для "Joda" и "formatter", чтобы найти множество примеров настройки на другие часовые пояса.

0 голосов
/ 18 августа 2011

Использование System.currentTimeMillis () не только намного быстрее, чем использование календаря или даты, оно всегда дает вам время по Гринвичу.Если вы хотите отобразить это время, вы можете использовать SimpleDateFormat, устанавливая часовой пояс на то, что вам нужно.

0 голосов
/ 18 августа 2011

Вы должны попробовать GregorianCalendar # setTimeZone (TimeZone timeZone).

0 голосов
/ 18 августа 2011

Внутри объекта Calendar хранится время в формате UTC (современное название для GMT). getTimeInMillis() возвращает значение UTC, и, вероятно, это то, что вы хотите сохранить.

...