У меня проблемы с классом Date в Java. Класс Date возвращает дату локального компьютера, но мне нужен UTC-0.
У меня есть googled и нашел отличное решение для JavaScript, но для Java ничего полезного.
Как получить UTC + 0 в Java 8?
У меня проблемы с классом Date в Java. Класс Date возвращает дату локального компьютера, но мне нужен UTC-0.
У меня есть googled и нашел отличное решение для JavaScript, но для Java ничего полезного.
Как получить UTC + 0 в Java 8?
С Java 8 вы можете написать:
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
Чтобы ответить на ваш комментарий, вы можете затем преобразовать его в Date (если вы не зависите от унаследованного кода, я не вижу причин для этого) или в millis со времен:
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toEpochSecond() * 1000;
Instant.now()
Неприятные старые классы даты и времени, включенные в ранние версии Java, были вытеснены классами java.time, встроенными в Java 8 и более поздние версии. Смотрите Oracle Tutorial. Большая часть функциональности была перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в 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
.
В этом примере мы применяем часовой пояс Монреаля. Летом, при бессмысленности -04:00
летнее время (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
и из java.time.ZonedDateTime
.
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытеснять неприятные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.
Чтобы узнать больше, смотрите Oracle Tutorial. И поиск для многих примеров и объяснений. Спецификация JSR 310.
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.*
.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
В Java8 вы используете новый Time API и конвертируете Instant в ZonedDateTime Используя UTC TimeZone
В 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);