ТЛ; др
посоветуйте текущую «лучшую практику» Date
иCalendar
это лучше , чтобы всегда благоприятствует Calendar
надDate
Избегайте этих старых классов полностью. Вместо этого используйте классы java.time .
- На мгновение в UTC используйте (современный эквивалент )
Instant
Date
- На мгновение в конкретном часовом поясе используйте (современный эквивалент )
ZonedDateTime
GregorianCalendar
- На мгновение в определенном смещении от UTC используйте (нет эквивалента в унаследованных классах)
OffsetDateTime
- Для даты-времени (не момента) с неизвестным часовым поясом или смещением используйте (нет эквивалента в унаследованных классах)
LocalDateTime
подробности
Ответа на этот вопрос Ortomala Lokni правильно предложил использовать современные java.time классы , а не назойливых старых классов наследство даты и времени ( Date
, Calendar
и т.д.). Но в этом ответе предлагается неправильный класс в качестве эквивалента (см. Мой комментарий к этому ответу).
Использование java.time
Классы java.time - это значительное улучшение по сравнению с традиционными классами даты и времени, разница между днем и ночью. Старые классы плохо спроектированы, запутаны и хлопотны. Вы должны избегать старых классов, когда это возможно. Но когда вам нужно преобразовать в / из старого / нового, вы можете сделать это, вызвав новые методы add для старых классов.
Для получения дополнительной информации о преобразовании см. Мой ответ и изящную диаграмму в другой вопрос. Преобразовать 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
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как java.util.Date
, Calendar
, и SimpleDateFormat
.
Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Используя драйвер JDBC, совместимый с JDBC 4.2 или новее, вы можете обмениваться объектами java.time напрямую с вашей базой данных. Нет необходимости ни в строках, ни в java.sql. * Классах.
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval
, YearWeek
, YearQuarter
, и более .