Невозможно преобразовать форматированную строку в LocalDateTime

Я пытаюсь преобразовать объект String Fri August 16 2019 12:08:55 AM в LocalDateTime, используя следующий код:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMMM d YYYY h:mm:ss a", Locale.US);
String timestamp = "Fri August 16 2019 12:08:55 AM";
localDateTime = LocalDateTime.parse(timestamp, formatter);

Этот код выдает следующее исключение:

java.time.format.DateTimeParseException: Text 'Fri August 16 2019 12:08:55 AM' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2019, MonthOfYear=8, DayOfWeek=5, DayOfMonth=16},ISO resolved to 00:08:55 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(Unknown Source)
    at java.time.format.DateTimeFormatter.parse(Unknown Source)
    at java.time.LocalDateTime.parse(Unknown Source)
    at suppliers.pojos.PriceFluctuationPOJO.<init>(PriceFluctuationPOJO.java:51)
    at suppliers.pojos.PriceFluctuationPOJO.readFromPriceFluctuationCSVFile(PriceFluctuationPOJO.java:163)
    at amzn.Main.main(Main.java:60)
Caused by: java.time.DateTimeException: Unable to obtain LocalDateTime from TemporalAccessor: {WeekBasedYear[WeekFields[SUNDAY,1]]=2019, MonthOfYear=8, DayOfWeek=5, DayOfMonth=16},ISO resolved to 00:08:55 of type java.time.format.Parsed
    at java.time.LocalDateTime.from(Unknown Source)
    at java.time.format.Parsed.query(Unknown Source)

На основе этого и этот поток на SO кажется, что формат правильный.

Что вызывает исключение?

Спасибо


person S.O.S    schedule 12.09.2019    source источник
comment
Нет необходимости добавлять одинарные кавычки внутри строки, удалите одинарные кавычки   -  person Arjun V    schedule 12.09.2019


Ответы (1)


У вас не должно быть одинарных кавычек во входных данных String, и ваш шаблон отключен. Вы хотели yyyy (не YYYY). Нравиться,

DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
        "EEE MMMM d yyyy hh:mm:ss a", Locale.US);
String timestamp = "Fri August 16 2019 12:08:55 AM";
LocalDateTime localDateTime = LocalDateTime.parse(timestamp, formatter);
System.out.println(localDateTime);

Выходы (здесь)

2019-08-16T00:08:55
person Elliott Frisch    schedule 12.09.2019
comment
Ой! Я по ошибке скопировал шаблон, который использовал для создания оригинальной строки SimpleDateFormat dateFormatter = new SimpleDateFormat(EEE MMMM YYYY h:mm:ss a); но вы правы, DateTimeFormatter имеет другие требования к форматированию, чем SimpleDateFormat. Спасибо! - person S.O.S; 12.09.2019
comment
@S.O.S SimpleDateFormat общеизвестно хлопотный и давно устарел, вы вообще не должны его использовать. В любом случае, разница между строчными и прописными буквами Y одинакова. При форматировании результат будет одинаковым в 98 или 99 % случаев, так что вряд ли вы сразу обнаружите ошибку, но использовать неверный регистр все же можно. ошибка. - person Ole V.V.; 12.09.2019