ТЛ; др
рекомендует текущую "лучшую практику" около Date
и Calendar
лучше всегда отдавать предпочтение Calendar
более Date
Избегайте этих устаревших классов полностью. Вместо этого используйте java.time классы.
- На мгновение в UTC , используйте
Instant
(современный эквивалент Date
)
- На мгновение в конкретном часовом поясе используйте
ZonedDateTime
(современный эквивалент GregorianCalendar
)
- На мгновение в конкретном смещении от UTC , используйте
OffsetDateTime
(нет эквивалента в унаследованных классах)
- Для даты-времени (не момента) с неизвестным часовым поясом или смещением используйте
LocalDateTime
(нет эквивалента в унаследованных классах)
Подробнее
Ответ от Ortomala Локни вправе предложить использовать современные java.time классы, а не трудоемкие старые классы даты и времени (Date
, Calendar
, так далее.). Но в этом ответе предлагается неправильный класс как эквивалентный (см. Мой комментарий к этому ответу).
Использование java.time
Классы java.time - это огромное улучшение по сравнению с традиционными классами даты и времени, разница между днем и ночью. Старые классы плохо спроектированы, запутаны и хлопотны. Вы должны избегать старых классов, когда это возможно. Но когда вам нужно преобразовать в / из старого / нового, вы можете сделать это, вызвав новые методы, добавляемые к old классам.
Для получения дополнительной информации о преобразовании см. мой ответ и изящную диаграмму в другой вопрос, Преобразовать java.util.Date для какого типа «java.time»? .
Поиск переполнения стека дает сотни примеров вопросов и ответов по использованию java.time. Но вот краткий обзор.
Instant
Получить текущий момент с Instant
. Класс Instant
представляет момент на временной шкале в UTC с разрешением наносекунд (до девяти (9) цифр десятичной дроби).
Instant instant = Instant.now();
ZonedDateTime
Чтобы увидеть, что тот же самый одновременный момент через линзу времени настенных часов некоторого конкретного региона , примените часовой пояс (ZoneId
), чтобы получить a ZonedDateTime
.
Часовой пояс
Укажите собственное имя часового пояса в формате continent/region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 3-4-буквенное сокращение, такое как EST
или IST
, поскольку они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone();
Смещение
Часовой пояс - это история изменений региона в его смещении от UTC . Но иногда вам дают только смещение без полной зоны. В этом случае используйте класс OffsetDateTime
.
ZoneOffset offset = ZoneOffset.parse( "+05:30" );
OffsetDateTime odt = instant.atOffset( offset );
Использование часового пояса предпочтительнее использования простого смещения.
LocalDateTime
«Локальный» в классах Local…
означает любой населенный пункт, а не конкретный населенный пункт. Так что имя может быть нелогичным.
LocalDateTime
, LocalDate
и LocalTime
преднамеренно не содержат никакой информации о смещении или часовом поясе. Таким образом, они не представляют фактические моменты, они не точек на временной шкале. В случае сомнений или путаницы используйте ZonedDateTime
вместо LocalDateTime
. Поиск переполнения стека для гораздо большего обсуждения.
Строка
Не путайте объекты даты и времени со строками, представляющими их значение. Вы можете проанализировать строку, чтобы получить объект даты и времени, и вы можете сгенерировать строку из объекта даты и времени. Но строка никогда не является самой датой-временем.
Узнайте о стандартных ISO 8601 форматах, используемых по умолчанию в классах java.time.
О java.time
The java.time Framework встроен в Java 8 и более поздние версии. Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует выполнить переход на классы java.time .
Чтобы узнать больше, см. Учебное пособие по Oracle . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Используя драйвер JDBC , совместимый с JDBC 4.2 или новее, вы можете напрямую обмениваться объектами java.time с вашей базой данных. Нет необходимости ни в строках, ни в java.sql. * Классах.
Где получить классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .