У меня проблемы с классом Date в Java. Класс Date возвращает дату локального компьютера, но мне нужен UTC-0.
Я погуглил и нашел отличное решение для JavaScript, но для Java ничего полезного.
Как получить дату UTC + 0 в Java 8?
У меня проблемы с классом Date в Java. Класс Date возвращает дату локального компьютера, но мне нужен UTC-0.
Я погуглил и нашел отличное решение для JavaScript, но для Java ничего полезного.
Как получить дату UTC + 0 в Java 8?
Ответы:
С Java 8 вы можете написать:
OffsetDateTime utc = OffsetDateTime.now(ZoneOffset.UTC);
Чтобы ответить на ваш комментарий, вы можете затем преобразовать его в дату (если вы не зависите от устаревшего кода, я не вижу причин почему) или в миллисекунды с эпох:
Date date = Date.from(utc.toInstant());
long epochMillis = utc.toInstant().toEpochMilli();
OffsetDateTime
, ZonedDateTime
если бы мы работали с простым смещением от UTC, а не с полным часовым поясом?
utc.toInstant().toEpochMilli()
бы более точного преобразования в миллис?
Instant.now()
Утомительные старые классы даты и времени, входящие в состав самых ранних версий Java, были вытеснены классами java.time, встроенными в Java 8 и более поздних версий . См. Учебное пособие по Oracle . Большая часть функциональности была перенесена на 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
Если вы хотите отобразить время на настенных часах для определенного часового пояса, примените a, 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
.
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Чтобы узнать больше, см. Oracle Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или новее. Нет необходимости в строках, нет необходимости в java.sql.*
занятиях. Поддержка Hibernate 5 и JPA 2.2 java.time .
Где взять классы java.time?
ZonedDateTime
, не было бы необходимости, так как все ZoneId
было бы сопоставлено с тем, что ZoneOffset
мы могли бы просто использовать OffsetDateTime
?
В 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);
Instant
есть не по местному времени. По Instant
определению находится в формате UTC. Так что нет необходимости в махинациях, замеченных в этом Ответе, при попытке попасть в UTC; Instant
уже находится в UTC. См. Мой ответ для получения дополнительной информации и более простого кода.
В Java8 вы используете новый API времени и конвертируете Instant в ZonedDateTime, используя часовой пояс UTC.
Однострочное решение в Java 8:
public Date getCurrentUtcTime() {
return Date.from(Instant.now());
}
java.util.Date
устарела.
java.util.Date
никогда не является датой локального компьютера. Он всегда определяется как прошедшие миллисекунды с 01.01.1970 относительно UTC + 00:00. Возможно,toString()
вас смущает поведение его метода , который действительно использует представление в местном часовом поясе.