Перейти к основному содержимому

Преобразование даты Java в OffsetDateTime

· 2 мин. чтения

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 .