Câu hỏi Không thể lấy LocalDateTime từ TemporalAccessor khi phân tích cú pháp LocalDateTime (Java 8)


Tôi chỉ đơn giản là cố gắng chuyển đổi một chuỗi ngày tháng thành một đối tượng DateTime trong Java 8. Khi chạy các dòng sau:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime dt = LocalDateTime.parse("20140218", formatter);

Tôi nhận được lỗi sau đây:

Exception in thread "main" java.time.format.DateTimeParseException: 
Text '20140218' could not be parsed: 
Unable to obtain LocalDateTime from TemporalAccessor: 
{},ISO resolved to 2014-02-18 of type java.time.format.Parsed
    at java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:1918)
    at java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1853)
    at java.time.LocalDateTime.parse(LocalDateTime.java:492)

Cú pháp giống hệt với cú pháp được đề xuất đây, nhưng tôi được phục vụ với một ngoại lệ. tôi đang dùng JDK-8u25.


76
2017-12-13 00:04


gốc


Xin hãy xem câu trả lời @ZeroOne stackoverflow.com/a/43675230/4914577  là tốt, nếu bạn đang tìm kiếm LocalDate. - Peru


Các câu trả lời:


Nó chỉ ra Java không chấp nhận một giá trị Date trần như DateTime. Sử dụng LocalDate thay vì LocalDateTime giải quyết vấn đề:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate dt = LocalDate.parse("20140218", formatter);

99
2017-12-13 00:20



Đối với những gì nó có giá trị: Tôi đã có cùng một vấn đề này ngay cả khi sử dụng LocalDate và không LocalDateTime. Vấn đề là tôi đã tạo ra DateTimeFormatter sử dụng .withResolverStyle(ResolverStyle.STRICT);, vì vậy tôi đã phải sử dụng mẫu ngày uuuuMMdd thay vì yyyyMMdd (ví dụ: "năm" thay vì "năm tuổi")! - ZeroOne
@ZeroOne Cảm ơn bạn 'uuuu' chính xác là câu trả lời cho câu hỏi này nếu chạy ở chế độ nghiêm ngặt - Justin Ohms
@ ZeroOne đây là câu trả lời đúng với người giải quyết nghiêm ngặt. Cảm ơn bạn rất nhiều! - laughing_man
@ ZeroOne Tôi nghĩ bạn nên đăng nó như một câu trả lời độc lập. Nó là tốt hơn nhiều so với bất kỳ câu trả lời khác, và sẽ dễ dàng hơn để phát hiện hơn bình luận cho câu hỏi. - charlie_pl
@charlie_pl OK, cảm ơn cho ý tưởng, và ở đây bạn đi: stackoverflow.com/a/43675230/1333157 ! :) - ZeroOne


Nếu bạn thực sự cần phải chuyển đổi một ngày thành một đối tượng LocalDateTime, bạn có thể sử dụng LocalDate.atStartOfDay (). Điều này sẽ cung cấp cho bạn một đối tượng LocalDateTime vào ngày được chỉ định, có các trường giờ, phút và giây được đặt thành 0:

final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDateTime time = LocalDate.parse("20140218", formatter).atStartOfDay();

37
2017-10-01 11:33



Chỉnh sửa: được đặt thành bất cứ lúc nào nó sẽ là lúc bắt đầu ngày hôm đó. - Trejkaz
LocalDateTime.from có vẻ không cần thiết, như atStartOfDay() đã trả về LocalDateTime. - Dariusz
scala: val time = LocalDate.parse ("20171220", DateTimeFormatter.ofPattern ("yyyyMMdd")). atStartOfDay.format (DateTimeFormatter.ofPattern ("yyyy-MM-dd HH: mm: ss")) - Woody Sun


Đây là một thông báo lỗi thực sự không rõ ràng và không hữu ích. Sau nhiều lần thử và sai, tôi thấy rằng LocalDateTime sẽ cung cấp cho các lỗi trên nếu bạn không cố gắng phân tích cú pháp một thời gian. Bằng cách sử dụng LocalDate thay vào đó, nó hoạt động mà không có lỗi.

Đây là tài liệu kém và ngoại lệ liên quan là rất vô ích.


26
2018-01-26 23:33





Đối với những gì là giá trị nếu có ai nên đọc lại chủ đề này (như tôi) câu trả lời đúng sẽ là DateTimeFormatter định nghĩa, ví dụ:

private static DateTimeFormatter DATE_FORMAT =  
            new DateTimeFormatterBuilder().appendPattern("dd/MM/yyyy[ [HH][:mm][:ss][.SSS]]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
            .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
            .toFormatter(); 

Bạn nên đặt các trường tùy chọn nếu chúng xuất hiện. Và phần còn lại của mã phải giống hệt nhau.


22
2017-09-25 09:11



Đây là giải pháp phổ quát thực sự ví dụ cho phương thức như vậy: Long getFileTimestamp (tệp String, mẫu Pattern, DateTimeFormatter dtf, int group); Ở đây bạn có các mẫu khác nhau và DateTimeFormetter, w / và w / o thời gian được chỉ định. - toootooo
Nó có thể là một lĩnh vực tĩnh? Tôi đã không tìm thấy trong Javadoc rằng một thể hiện được tạo ra theo cách đó là an toàn thread - Kamil Roman


Mở rộng trên câu trả lời của retrography..: Tôi đã có cùng một vấn đề này ngay cả khi sử dụng LocalDate và không LocalDateTime. Vấn đề là tôi đã tạo ra DateTimeFormatter sử dụng .withResolverStyle(ResolverStyle.STRICT);, vì vậy tôi đã phải sử dụng mẫu ngày uuuuMMdd thay vì yyyyMMdd (ví dụ: "năm" thay vì "năm tuổi")!

DateTimeFormatter formatter = new DateTimeFormatterBuilder()
  .parseStrict()
  .appendPattern("uuuuMMdd")
  .toFormatter()
  .withResolverStyle(ResolverStyle.STRICT);
LocalDate dt = LocalDate.parse("20140218", formatter);

(Giải pháp này ban đầu là một bình luận cho câu trả lời của retrography, nhưng tôi được khuyến khích để đăng nó như là một câu trả lời độc lập bởi vì nó dường như hoạt động thực sự tốt cho nhiều người.)


14
2018-04-28 08:10



Cảm ơn @ZeroOne vì câu trả lời của bạn. Không chắc chắn lý do các nhà phát triển ofjava.time.DateTimeFormatterBuilder ưa thích có "uuuu" thay vì "yyyy" - Peru


Nếu chuỗi ngày không bao gồm bất kỳ giá trị nào cho giờ, phút và v.v. bạn không thể chuyển đổi trực tiếp giá trị này thành LocalDateTime. Bạn chỉ có thể chuyển đổi nó thành LocalDate, bởi vì chuỗi chỉ có  đại diện các năm, tháng và ngày các thành phần nó sẽ là điều đúng đắn để làm.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf); // 2018-03-06

Dù sao, bạn có thể chuyển đổi thành LocalDateTime.

DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate ld = LocalDate.parse("20180306", dtf);
LocalDateTime ldt = LocalDateTime.of(ld, LocalTime.of(0,0)); // 2018-03-06T00:00

5
2018-03-12 09:38





Đối với bất kỳ ai đã đến đây với lỗi này, như tôi đã làm:

Unable to obtain LocalDateTime from TemporalAccessor: {HourOfAmPm=0, MinuteOfHour=0}

Nó đến từ một dòng sau:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy h:mm"));

Hóa ra đó là bởi vì tôi đã sử dụng một mẫu 12 giờ giờ trên một giờ 0, thay vì một mẫu 24 giờ.

Thay đổi mẫu giờ sang 24 giờ bằng cách sử dụng thủ đô H sửa lỗi:

LocalDateTime.parse(date, DateTimeFormatter.ofPattern("M/d/yy H:mm"));

4
2018-05-17 19:18



Câu trả lời này đã lưu vào ngày của tôi - pedram bashiri