tl;dr
посоветуйте текущую "передовую практику" в отношении Date
и Calendar
лучше всегда отдавать предпочтение Calendar
над Date
Полностью избегайте этих устаревших классов. Вместо этого используйте классы java.time.
- На мгновение в UTC используйте _ 5_
(современный эквивалент Date
)
- На мгновение в определенном часовом поясе используйте _ 7_
(современный эквивалент GregorianCalendar
)
- На мгновение в конкретном offset-from-UTC используйте _ 9_
(нет эквивалента в устаревших классах)
- Для даты и времени (не момента) с неизвестным часовым поясом или смещением используйте _ 10_
(нет эквивалента в устаревших классах)
Подробности
Ответ Ортомалы Локни прав, предлагая использовать современный 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
, например _ 21_, _ 22_ или 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
. Найдите Stack Overflow для более подробного обсуждения.
Струны
Не объединяйте объекты даты и времени со строками, представляющими их значение. Вы можете проанализировать строку, чтобы получить объект даты и времени, и вы можете сгенерировать строку из объекта даты и времени. Но строка никогда не является самой датой и временем.
Узнайте о стандартных форматах ISO 8601, используемых по умолчанию в классах java.time.
О java.time
java.time framework встроена в Java 8 и новее. Эти классы заменяют неудобные старые устаревшие классы даты и времени, такие как _ 36_, _ 37_, & _ 38_.
Проект Joda-Time теперь в режим обслуживания, советует перейти на java.time классы.
Чтобы узнать больше, см. Руководство по Oracle . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310.
Использование драйвера JDBC, совместимого с JDBC 4.2 или новее, вы можете обмениваться объектами java.time непосредственно с вашей базой данных. Не нужны ни строки, ни классы java.sql. *.
Где взять классы java.time?
- Java SE 8, Java SE 9, and later
- Built-in.
- Часть стандартного Java API со встроенной реализацией.
- В Java 9 добавлены некоторые незначительные функции и исправления.
- Java SE 6 and Java SE 7
- Much of the java.time functionality is back-ported to Java 6 & 7 in ThreeTen-Backport.
- Android
- Later versions of Android bundle implementations of the java.time classes.
- Для более ранних версий Android проект ThreeTenABP адаптируется к < em> ThreeTen-Backport (упомянутый выше). См. Как использовать ThreeTenABP….
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательной площадкой для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, например _39 _, YearWeek
, _ 41_ и подробнее.
person
Basil Bourque
schedule
28.02.2017
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
, теперь унаследованы, их заменили java.time классы. Большая часть функций java.time перенесена на Java 6 и Java 7 в ThreeTen-Backport. Дальнейшая адаптация для более ранних версий Android в ThreeTenABP проект. См. Как использовать ThreeTenABP…. - person Basil Bourque   schedule 23.02.2018