Преобразовать строку этого формата «гггг-ММ-дд'ТЧЧ: мм: сс.СССХХХ» в LocalDate - PullRequest
2 голосов
/ 24 октября 2019

Я хочу преобразовать строковую дату (с указанием часового пояса) в LocalDate.

String format = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
String date = "2019-08-31T17:00:00.000-07:00";

System.out.println("LocalDate: " + LocalDate.parse(date, DateTimeFormatter.ofPattern(format)));
System.out.println("Date: " + new SimpleDateFormat(format).parse(date));

, и вывод приведенного выше кода будет

LocalDate: 2019-08-31
Date: Sun Sep 01 05:30:00 IST 2019

Я не могу получитьтот же результат, который получил от SimpleDateFormat. Я хочу 2019-09-01 в LocalDate.

1 Ответ

7 голосов
/ 24 октября 2019

Обратите внимание, что старый класс Date представляет момент времени , а не локальную дату. Просто так получается, что Date.toString выводит строку, как если бы она находилась в системном часовом поясе.

API java.time заставляет вас задуматься о том, что вы хотите. Он предоставляет вам разные типы для представления разных временных концепций. LocalDate.parse будет интерпретировать только часть строки "local date".

Ваша строка даты представляет OffsetDateTime, поэтому вам следует использовать OffsetDateTime.parse. Теперь у вас есть LocalDateTime плюс ZoneOffset. Чтобы сделать его 09-01, вы должны изменить его зону, сохраняя при этом тот же момент, что можно сделать с помощью atZoneSameInstant, а затем получить часть локальной даты:

System.out.println("LocalDate: " +
        OffsetDateTime.parse(date, DateTimeFormatter.ofPattern(format))
                .atZoneSameInstant(ZoneOffset.systemDefault())
                .toLocalDate());
...