1. введение
В этом уроке мы узнаем о разнице между Date и OffsetDateTime . Мы также учимся как переходить из одного в другое.
2. Разница между датой и временем смещения
OffsetDateTime был представлен в JDK 8 как современная альтернатива java.util.Дата .
OffsetDateTime -это потокобезопасный класс, который хранит дату и время с точностью до наносекунд. Дата , с другой стороны, не является потокобезопасной и сохраняет время с точностью до миллисекунды.
OffsetDateTime -это класс, основанный на значениях, что означает, что нам нужно использовать equals при сравнении ссылок вместо типичного ==.
Вывод метода OffsetDateTime ‘s toString находится в формате ISO-8601, в то время как Date ‘s toString находится в пользовательском нестандартном формате.
Давайте вызовем toString on обоих классов, чтобы увидеть разницу:
Date: Sat Oct 19 17:12:30 2019 OffsetDateTime: 2019-10-19T17:12:30.174Z
Дата не может хранить часовые пояса и соответствующие смещения. Единственное, что содержит объект Date , – это количество миллисекунд с 1 января 1970 года, 00:00:00 UTC, поэтому, если наше время не находится в UTC, мы должны сохранить часовой пояс в вспомогательном классе . Напротив, OffsetDateTime хранит Смещение зоны внутри.
3. Преобразование даты в OffsetDateTime
Преобразование Date в 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 предоставляет множество полезных методов , которые можно использовать позже. Например, мы можем просто getDayOfWeek() , getDayOfMonth () и getDayOfYear(). Также очень легко сравнить два объекта OffsetDateTime с методами isAfter и isBefore .
Прежде всего, рекомендуется полностью избегать устаревшего класса Date .
4. Заключение
В этом уроке мы узнали, как просто преобразовать Date в OffsetDateTime .
И, как всегда, код доступен на Github .