У меня возникли проблемы с форматированием строки в 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 для часа дня в строке шаблона формата, как, например, в этот вопрос.
@ОлеВ.В. Как вы думаете, это связано, хотя это не решает мою проблему? Я просто спрашиваю, чтобы в следующий раз не создавать аналогичный вопрос
Я думаю, что вопрос, указанный под дублирующей маркировкой, лучше соответствует вашему и должен иметь большие шансы решить вашу проблему. Посмотрите, если это не так, и не стесняйтесь следить за этим здесь.
@ОлеВ.В. Я пробовал это (если вы видите в моем вопросе, есть DateTimeFormatBuilder, который был частично взят оттуда), поэтому я открыл новый вопрос. Но, как указал YCF_L, все, что мне было нужно, это напрямую использовать ZonedDateTime с самого начала.
Правильно: строка не содержит достаточно информации, чтобы ZonedDateTime мог разобрать то же значение обратно.
@ОлеВ.В. спасибо, однако, за объяснение, почему вы пометили это как дубликат :)




ddMMyyyyhhmmss не содержит никакой информации о зоне, это не ZonedDateTime, должно быть LocalDateTime.
Я уже пробовал этот подход, но все еще имею ту же ошибку
@ДжанмаркоФ. Я также не понимаю, почему вы должны использовать ZonedDateTime. Использование String test = formatter.format(LocalDateTime.now()).toString(); LocalDateTime parsed = LocalDateTime.parse(test, formatter); делает именно то, о чем вы просили.
В строке, которую вы анализируете, нет информации о TimeZone, так как же Formatter должен знать, как перейти в ZonedDateTime?
Вам либо нужно иметь информацию о часовом поясе в своей строке, либо использовать другой объект для его анализа, в котором нет информации о часовом поясе, а затем передать его в нужную вам зону.
Я также пытался использовать LocalDateTime, но все равно получаю то же сообщение об ошибке.
@ДжанмаркоФ. нет, вы не получили такое же сообщение об ошибке. В текущем сообщении об ошибке явно указано, что отсутствует информация о часовом поясе. Что бы вы ни говорили, этого не произойдет, если вы используете LocalDateTime. Если у вас возникли проблемы при использовании LocalDateTime, измените свои вопросы и покажите свой точный код и точные результаты.
Помимо проблемы с отсутствием информации о часовом поясе, правильно, что он также не работает с LocalDateTime, но это из-за использования чч вместо чч в DateTimeFormatter (как указано выше).
В этом случае ошибка исходила из того, что hh не было заглавными буквами, и это вызвало ошибку.
Ты хочешь :
String test = ZonedDateTime.now().format(formatter);
Связано: Не удалось получить ZonedDateTime из TemporalAccessor с использованием DateTimeFormatter и ZonedDateTime в Java 8