Không thể có được LocalDateTime từ TemporalAccessor khi phân tích cú pháp LocalDateTime (Java 8)


150

Tôi chỉ đơn giản là cố gắng chuyển đổi một chuỗi ngày 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 những gì đã được đề xuất ở đây , nhưng tôi được phục vụ với một ngoại lệ. Tôi đang sử dụng JDK-8u25.

Câu trả lời:


177

Hóa ra Java không chấp nhận giá trị Date trần là 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);

42
Đối với những gì nó có giá trị: Tôi đã có vấn đề tương tự ngay cả khi sử dụng LocalDatevà không LocalDateTime. Vấn đề là tôi đã tạo ra DateTimeFormattercách sử dụng của mình .withResolverStyle(ResolverStyle.STRICT);, vì vậy tôi phải sử dụng mẫu ngày uuuuMMddthay vì yyyyMMdd(tức là "năm" thay vì "năm của thời đại")!
ZeroOne 22/03/2016

71

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 đã 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();

2
Sửa chữa: được đặt thành bất cứ lúc nào vào lúc bắt đầu ngày hôm đó .
Trejkaz

20
LocalDateTime.fromdường như không cần thiết, như atStartOfDay()đã trở lại LocalDateTime.
Dariusz

1
scala: thời gian val = LocalDate.parse ( "20.171.220", DateTimeFormatter.ofPattern ( "yyyyMMdd")) atStartOfDay.format (DateTimeFormatter.ofPattern ( "yyyy-MM-dd HH: mm: ss")).
Woody Sun

48

Đối với những gì có giá trị nếu bất cứ ai nên đọc lại chủ đề này (như tôi), câu trả lời đúng sẽ là trong 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(); 

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


1
Đây là giải pháp phổ quát thực sự cho ví dụ cho phương thức đó: Long getFileTimestamp (Tệp chuỗi, Mẫu mẫu, DateTimeFormatter dtf, int nhóm); Ở đây bạn có các mẫu khác nhau và DateTimeFormetter, thời gian w / và w / o được chỉ định.
toootooo

Nó có thể là một trường tĩnh? Tôi đã không tìm thấy trong Javadoc rằng một cá thể được tạo theo cách đó là an toàn cho chuỗi
Kamil Roman

Nhớ thêm parseDefaultingSAU bạn đã gọi appendPattern. Nếu không nó sẽ cho DateTimeParseException.
wittyameta

31

Đây là một thông báo lỗi thực sự không rõ ràng và không có ích. Sau nhiều thử nghiệm và lỗi tôi thấy rằng LocalDateTimesẽ đưa ra lỗi trên nếu bạn không cố phân tích thời gian. Bằng cách sử dụng LocalDatethay thế, 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 không có ích.


25

Mở rộng về câu trả lời của retrograph ..: Tôi gặp vấn đề tương tự ngay cả khi sử dụng LocalDatevà không LocalDateTime. Vấn đề là tôi đã tạo ra DateTimeFormattercách sử dụng của mình .withResolverStyle(ResolverStyle.STRICT);, vì vậy tôi phải sử dụng mẫu ngày uuuuMMddthay vì yyyyMMdd(tức là "năm" thay vì "năm của thời đạ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 nhận xét cho câu trả lời của retrography, nhưng tôi được khuyến khích đăng nó dưới dạng câu trả lời độc lập vì rõ ràng nó hoạt động thực sự tốt cho nhiều người.)


1
Câu trả lời cho lý do tại sao "u" thay vì "y" đã được trả lời trong liên kết này uuuu-vs.-yyyy-in-datetimeformatter-định dạng-mẫu-mã-trong-java @Peru
prashanth

23

Đối với bất kỳ ai hạ cánh ở đâ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à vì tôi đang sử dụng mẫu 12 giờ trên 0 giờ, thay vì mẫu 24 giờ.

Thay đổi mẫu giờ thành 24 giờ bằng cách sử dụng vốn H sửa nó:

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

12

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

Cũng đảm bảo định dạng là chính xác. Khắc phục sự cố này không hiệu quả với tôi cho đến khi tôi đặt định dạng thành yyyy-mm-ddkhi nó cần yyyy-MM-dd.
tuần tra

0

Hãy thử cái này:

DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("MM-dd-yyyy"); 
LocalDate fromLocalDate = LocalDate.parse(fromdstrong textate, dateTimeFormatter);

Bạn có thể thêm bất kỳ định dạng nào bạn muốn. Nó ổn với tôi!


0

Cái này hoạt động tốt

public class DateDemo {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm");
        String date = "16-08-2018 12:10";
        LocalDate localDate = LocalDate.parse(date, formatter);
        System.out.println("VALUE="+localDate);

        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm");
        LocalDateTime parse = LocalDateTime.parse(date, formatter1);
        System.out.println("VALUE1="+parse);
    }
}

đầu ra:

VALUE=2018-08-16
VALUE1=2018-08-16T12:10
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.