Java.time.format.DateTimeParseException: невозможно получить ZonedDateTime из TemporalAccessor в формате ddMMyyyhhmmss

У меня возникли проблемы с форматированием строки в ZonedDateTime.
Мой клиент хочет иметь дату в формате ddMMyyyhhmmss, без разделителей и тому подобного.
Это то, что я сделал до сих пор

import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;


public class MyClass {
    public static void main(String args[]) {

            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("ddMMyyyyhhmmss");
            String test = formatter
            .format(ZonedDateTime.now()).toString();
            System.out.println(test);
            ZonedDateTime a = ZonedDateTime.parse(test,formatter);
            System.out.println(a.toString());
    }
}

Хотя он правильно создает строку, ошибка возникает в процессе синтаксического анализа для создания переменной LocalDateTime.

28032019100707

Exception in thread "main" java.time.format.DateTimeParseException: Text '28032019100707' could not be parsed: Unable to obtain ZonedDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1920)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1855)
    at java.time.ZonedDateTime.parse(ZonedDateTime.java:597)
    at MyClass.main(MyClass.java:14)
Caused by: java.time.DateTimeException: Unable to obtain ZonedDateTime from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.ZonedDateTime.from(ZonedDateTime.java:565)
    at java.time.format.Parsed.query(Parsed.java:226)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1851)
    ... 2 more
Caused by: java.time.DateTimeException: Unable to obtain ZoneId from TemporalAccessor: {MilliOfSecond=0, MinuteOfHour=7, HourOfAmPm=10, NanoOfSecond=0, MicroOfSecond=0, SecondOfMinute=7},ISO resolved to 2019-03-28 of type java.time.format.Parsed
    at java.time.ZoneId.from(ZoneId.java:466)
    at java.time.ZonedDateTime.from(ZonedDateTime.java:553)
    ... 4 more
Command exited with non-zero status 1

При поиске на SO я увидел, что в некоторых ответах на ту же проблему предлагается использовать класс LocalDateTime в качестве промежуточного звена, а затем анализировать его в ZonedDateTime, но он все еще не работает, выдавая ту же ошибку. Я также пытался изменить способ инициализации DateTimeFormatter с помощью этой процедуры.

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("ddMMyyyyhhmmss")
                          .toFormatter()
                          .withZone(ZoneId.systemDefault());

Но это все еще не работает. Я знаю, что я наверняка упускаю что-то глупое, но я не вижу, что. Может ли кто-нибудь указать мне в правильном направлении?

Кроме того, вам нужны прописные буквы HH для часа дня в строке шаблона формата, как, например, в этот вопрос.

Ole V.V. 28.03.2019 11:20

@ОлеВ.В. Как вы думаете, это связано, хотя это не решает мою проблему? Я просто спрашиваю, чтобы в следующий раз не создавать аналогичный вопрос

Gianmarco F. 28.03.2019 11:20

Я думаю, что вопрос, указанный под дублирующей маркировкой, лучше соответствует вашему и должен иметь большие шансы решить вашу проблему. Посмотрите, если это не так, и не стесняйтесь следить за этим здесь.

Ole V.V. 28.03.2019 11:23

@ОлеВ.В. Я пробовал это (если вы видите в моем вопросе, есть DateTimeFormatBuilder, который был частично взят оттуда), поэтому я открыл новый вопрос. Но, как указал YCF_L, все, что мне было нужно, это напрямую использовать ZonedDateTime с самого начала.

Gianmarco F. 28.03.2019 11:25

Правильно: строка не содержит достаточно информации, чтобы ZonedDateTime мог разобрать то же значение обратно.

Ole V.V. 28.03.2019 12:10

@ОлеВ.В. спасибо, однако, за объяснение, почему вы пометили это как дубликат :)

Gianmarco F. 28.03.2019 12:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
7
2 107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

ddMMyyyyhhmmss не содержит никакой информации о зоне, это не ZonedDateTime, должно быть LocalDateTime.

Я уже пробовал этот подход, но все еще имею ту же ошибку

Gianmarco F. 28.03.2019 11:13

@ДжанмаркоФ. Я также не понимаю, почему вы должны использовать ZonedDateTime. Использование String test = formatter.format(LocalDateTime.now()).toString(); LocalDateTime parsed = LocalDateTime.parse(test, formatter); делает именно то, о чем вы просили.

CannedMoose 28.03.2019 11:30

В строке, которую вы анализируете, нет информации о TimeZone, так как же Formatter должен знать, как перейти в ZonedDateTime?

Вам либо нужно иметь информацию о часовом поясе в своей строке, либо использовать другой объект для его анализа, в котором нет информации о часовом поясе, а затем передать его в нужную вам зону.

Я также пытался использовать LocalDateTime, но все равно получаю то же сообщение об ошибке.

Gianmarco F. 28.03.2019 11:14

@ДжанмаркоФ. нет, вы не получили такое же сообщение об ошибке. В текущем сообщении об ошибке явно указано, что отсутствует информация о часовом поясе. Что бы вы ни говорили, этого не произойдет, если вы используете LocalDateTime. Если у вас возникли проблемы при использовании LocalDateTime, измените свои вопросы и покажите свой точный код и точные результаты.

kumesana 28.03.2019 11:21

Помимо проблемы с отсутствием информации о часовом поясе, правильно, что он также не работает с LocalDateTime, но это из-за использования чч вместо чч в DateTimeFormatter (как указано выше).

Alexander Rühl 28.03.2019 11:25

В этом случае ошибка исходила из того, что hh не было заглавными буквами, и это вызвало ошибку.

Gianmarco F. 28.03.2019 11:31
Ответ принят как подходящий

Ты хочешь :

  String test = ZonedDateTime.now().format(formatter);

Другие вопросы по теме