#java #date-format #java-time #zoneddatetime #datetimeformatter
#java #формат даты #java-время #zoneddatetime #datetimeformatter
Вопрос:
Пытаюсь проанализировать ZonedDateTime из строки даты, например, ‘2020-08-24’.
При использовании TemporalAccesor и DateTimeFormatter.ISO_OFFSET_DATE для анализа я получаю java.time.format.Исключение DateTimeParseException. Я использую неправильный форматировщик?
Даже пытался добавить ‘Z’ в конец строки даты, чтобы она понималась как UTC
private ZonedDateTime getZonedDateTime(String dateString) {
TemporalAccessor parsed = null;
dateString = dateString 'Z';
try {
parsed = DateTimeFormatter.ISO_OFFSET_DATE.parse(dateString);
} catch (Exception e) {
log.error("Unable to parse date {} using formatter DateTimeFormatter.ISO_INSTANT", dateString);
}
return ZonedDateTime.from(parsed);
}
Комментарии:
1.
yyyy-mm-dd
это довольно точная информация, хранящаяся вLocalDate
.ZoneDateTime
Для того, чтобы иметь, вам нужен компонент времени и некоторая информация о зоне, которой у вас, похоже, нет. Почему вы хотите разобрать это на aZonedDateTime
?2. Действительно, даже если вам в конечном итоге понадобится ZonedDateTime, я думаю, ожидания были бы понятнее, если бы вы проанализировали его как LocalDate, а затем преобразовали его в ZonedDateTime, указав время суток и часовой пояс.
Ответ №1:
Использовать LocalDate#atStartOfDay
Сделайте это следующим образом:
import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
// Define a DateTimeFormatter
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd");
// Given date string
String strDate = "2020-08-24";
// Parse the given date string to ZonedDateTime
ZonedDateTime zdt = LocalDate.parse(strDate, dtf).atStartOfDay(ZoneOffset.UTC);
System.out.println(zdt);
}
}
Вывод:
2020-08-24T00:00Z
Ответ №2:
Как упоминалось в сообщении, связанном в разделе комментариев :
Проблема в том, что
ZonedDateTime
необходимо создать все поля даты и времени (год, месяц, день, час, минута, секунда, наносекунда), но форматировщик ISO_OFFSET_DATE выдает строку без временной части.
И соответствующее решение
Одной из альтернатив для ее анализа является использование
DateTimeFormatterBuilder
и определение значений по умолчанию для полей времени
Ответ №3:
смещение в ISO_OFFSET_DATE означает, что часовой пояс указан как относительное смещение по отношению к UTC
таким образом, в конце вашего ввода ожидается что-то вроде » 01:00″.
Комментарии:
1.
Z
является ли правильное смещение в ISO-8601, вы должны проверить эти документы DateTimeFormatter docs.oracle.com/javase/8/docs/api/java/time/format /… и ZoneOffset docs.oracle.com/javase/8/docs/api/java/time /…