1. Введение
В этом руководстве мы узнаем о разнице между Date
и OffsetDateTime
. Мы также узнаем , как преобразовать одно в другое.
2. Разница между датой
и OffsetDateTime
OffsetDateTime
был представлен в JDK 8 как современная альтернатива java.util.Date
.
OffsetDateTime
— это потокобезопасный класс, который хранит дату и время с точностью до наносекунд. Date
, с другой стороны, не является потокобезопасным и хранит время с точностью до миллисекунды.
OffsetDateTime
— это класс, основанный на значениях, что означает, что нам нужно использовать равенство
при сравнении ссылок вместо типичного ==.
Выходные данные метода toString класса
OffsetDateTime имеют
формат ISO-8601, а метод toString класса
Date
— пользовательский нестандартный формат.
``
Давайте вызовем toString
для обоих классов, чтобы увидеть разницу:
Date: Sat Oct 19 17:12:30 2019
OffsetDateTime: 2019-10-19T17:12:30.174Z
Дата
не может хранить часовые пояса и соответствующие смещения. Единственное, что содержит объект Date
, — это количество миллисекунд с 1 января 1970 года, 00:00:00 UTC, поэтому, если наше время не в формате UTC, мы должны сохранить часовой пояс во вспомогательном классе . Напротив, OffsetDateTime
хранит ZoneOffset
внутри.
3. Преобразование даты
в OffsetDateTime
Преобразование даты
в OffsetDateTime
довольно просто. Если наша дата указана
в формате UTC, мы можем преобразовать ее с помощью одного выражения:
Date date = new Date();
OffsetDateTime offsetDateTime = date.toInstant()
.atOffset(ZoneOffset.UTC);
Если исходная дата
не в формате UTC, мы можем указать смещение (хранящееся во вспомогательном объекте, потому что, как упоминалось ранее, класс Date не может хранить часовые пояса).
Допустим, наша исходная дата
+3:30 (тегеранское время):
int hour = 3;
int minute = 30;
offsetDateTime = date.toInstant()
.atOffset(ZoneOffset.ofHoursMinutes(hour, minute));
OffsetDateTime
предоставляет множество полезных методов , которые можно использовать впоследствии. Например, мы можем просто получитьDayOfWeek()
, getDayOfMonth()
и getDayOfYear().
Также очень легко сравнить два объекта OffsetDateTime с помощью методов isAfter
и isBefore
.
Прежде всего, рекомендуется полностью избегать устаревшего класса Date .
4. Вывод
В этом уроке мы узнали, как просто преобразовать Date
в OffsetDateTime
.
И, как всегда, код доступен на Github .