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

1. Въведение

В този урок научаваме за разликата между Date и OffsetDateTime . Също така се научаваме как да конвертираме от едното в другото.

2. Разлика между Date и OffsetDateTime

OffsetDateTime беше представен в JDK 8 като модерна алтернатива на java.util.Date .

OffsetDateTime е безопасен за нишки клас, който съхранява дата и час с точност до наносекунди. Дата , от друга страна, не е безопасна за конци и съхранява време до милисекундна точност.

OffsetDateTime е клас, базиран на стойност, което означава, че трябва да използваме equals, когато сравняваме препратките, вместо типичното ==.

Изходът на OffsetDateTime е ToString метод е във формат ISO-8601, а Дата е ToString е в потребителски нестандартен формат.

Нека извикаме 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.