tl; dr
myJavaUtilDate.toInstant()
.plusHours( 8 )
Или…
myJavaUtilDate.toInstant() // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
.plus( // Do the math, adding a span of time to our moment, our `Instant`.
Duration.ofHours( 8 ) // Specify a span of time unattached to the timeline.
) // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.
Использование java.time
Среда java.time, встроенная в Java 8 и более поздние версии, вытесняет старуюКлассы Java.util.Date/.Calendar.Эти старые классы, как известно, хлопотно.Избегайте их.
Используйте метод toInstant
, недавно добавленный в java.util.Date, для преобразования старого типа в новый тип java.time.Instant
- это момент на временной шкале в UTC с разрешением наносекунд .
Instant instant = myUtilDate.toInstant();
Вы можете добавить часы к этому Instant
с помощьюпрохождение TemporalAmount
, например Duration
.
Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );
Чтобы прочитать эту дату-время, сгенерируйте строку в стандартном формате ISO 8601, вызвав toString
.
String output = instantHourLater.toString();
Возможно, вы захотите увидетьэтот момент сквозь объектив настенного времени какого-то региона .Настройте Instant
в желаемый / ожидаемый часовой пояс, создав ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
В качестве альтернативы, вы можете позвонить plusHours
, чтобы добавить количество часов.Зонирование означает, что летнее время (DST) и другие аномалии будут обрабатываться от вашего имени.
ZonedDateTime later = zdt.plusHours( 8 );
Вам следует избегать использования старых классов даты и времени, включая java.util.Date
и .Calendar
.Но если вам действительно нужен java.util.Date
для взаимодействия с классами, которые еще не обновлены для типов java.time, преобразуйте из ZonedDateTime
через Instant
.Новые методы, добавленные к старым классам, облегчают преобразование в / из типов java.time.
java.util.Date date = java.util.Date.from( later.toInstant() );
Подробнее о преобразовании см. мой ответ на вопрос, Преобразование Java.util.Date для какого типа «java.time»? .
О java.time
java.time Framework встроен в 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?
- Java SE 8 , Java SE 9 , а позднее
- Встроенный-в.
- Часть стандартного Java API с встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Android
- Более поздние версии реализации комплекта Android классов java.time.
- Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .