it-swarm.com.ru

Как получить дату UTC + 0 в Java 8?

У меня проблемы с классом Date в Java. Класс даты возвращает дату локального компьютера, но мне нужно UTC-0.

Я гуглил и нашел отличное решение для JavaScript, но для Java ничего полезного.

Как получить дату UTC + 0 в Java 8?

85
Mark

С Java 8 вы можете написать:

OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);

Чтобы ответить на ваш комментарий, вы можете затем преобразовать его в Date (если вы не зависите от устаревшего кода, я не вижу причин для этого) или в millis, начиная с эпох:

Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;
128
assylias

тЛ; др

Instant.now()

Java.time

Проблемные старые классы даты и времени, включенные в самые ранние версии Java, были вытеснены Java.time классами, встроенными в Java 8 и позже. Смотрите Oracle Tutorial . Большая часть функций была перенесена в Java 6 & 7 in ThreeTen-Backport и дополнительно адаптирована для Android in ThreeTenABP знак равно.

Instant

Instant представляет момент на временной шкале в UTC с разрешением до наносекунд .

Instant instant = Instant.now();

Метод toString генерирует объект String с текстом, представляющим значение даты и времени, используя один из стандартных форматов ISO 8601 .

String output = instant.toString();  

2016-06-27T19: 15: 25.864Z

Класс Instant - это базовый класс строительных блоков в Java.time. Это должно быть вашим начальным классом при работе с датой и временем, поскольку, как правило, рекомендуется отслеживать, хранить и обмениваться значениями даты и времени в формате UTC.

OffsetDateTime

Но Instant имеет ограничения, такие как отсутствие параметров форматирования для генерации строк в альтернативных форматах. Для большей гибкости преобразуйте из Instant в OffsetDateTime . Укажите смещение от UTC . В Java.time это означает ZoneOffset объект. Здесь мы хотим придерживаться UTC (+00), чтобы мы могли использовать удобную константу ZoneOffset.UTC .

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

2016-06-27T19: 15: 25.864Z

Или пропустите класс Instant.

OffsetDateTime.now( ZoneOffset.UTC )

Теперь, имея в руках объект OffsetDateTime, вы можете использовать DateTimeFormatter для создания объектов String с текстом в альтернативных форматах. Поиск переполнения стека для многих примеров использования DateTimeFormatter.

ZonedDateTime

Если вы хотите отобразить время настенных часов для определенного часового пояса, примените ZoneId , чтобы получить ZonedDateTime .

В этом примере мы применяем часовой пояс Монреаля. Летом, под Летнее время (DST) нонсенс, зона имеет смещение -04:00. Обратите внимание, что в выходных данных время дня на четыре часа раньше, 15 вместо 19 часов. Instant и ZonedDateTime представляют один и тот же момент одновременного просмотра, только если смотреть через два разных объектива.

ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );

2016-06-27T15: 15: 25.864-04: 00 [Америка/Монреаль]

Преобразование

Хотя вам следует избегать старых классов даты и времени, при необходимости вы можете конвертировать, используя новые методы, добавленные к старым классам. Здесь мы используем Java.util.Date.from( Instant ) и Java.util.Date::toInstant .

Java.util.Date utilDate = Java.util.Date.from( instant );

И иду в другом направлении.

Instant instant= utilDate.toInstant();

Аналогичным образом ищите новые методы, добавленные к GregorianCalendar (подкласс Calendar) для преобразования в Java.time.ZonedDateTime и обратно.

Table of types of date-time classes in modern Java.time versus legacy.


О Java.time

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

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

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

Вы можете обмениваться объектами Java.time напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или выше. Нет необходимости в строках, нет необходимости в классах 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 (<26) ThreeTenABP Проект адаптируется ThreeTen-Backport (упомянуто выше). Смотрите Как использовать ThreeTenABP… .

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

128
Basil Bourque

В Java8 вы используете новый API времени и конвертируете Instant в ZonedDateTime Используя TC TimeZone

3
rolfl

В Java8 я бы использовал класс Instant, который уже находится в UTC и с которым удобно работать.

import Java.time.Instant;

Instant ins = Instant.now();
long ts = ins.toEpochMilli();

Instant ins2 = Instant.ofEpochMilli(ts)

В качестве альтернативы вы можете использовать следующее:

import Java.time.*;

Instant ins = Instant.now(); 

OffsetDateTime odt = ins.atOffset(ZoneOffset.UTC);
ZonedDateTime zdt = ins.atZone(ZoneId.of("UTC"));

Вернуться к Instant

Instant ins4 = Instant.from(odt);
0
Abel Terefe