ZonedDateTime из строки даты в гггг-мм-дд

#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 Для того, чтобы иметь, вам нужен компонент времени и некоторая информация о зоне, которой у вас, похоже, нет. Почему вы хотите разобрать это на a ZonedDateTime ?

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 /…