2015-06-10 14 views
15

tôi quản lý để phân tích một String đến một đối tượng LocalDate:JDK8: không có khả năng phân tích localtime

DateTimeFormatter f1=DateTimeFormatter.ofPattern("dd MM yyyy"); 
LocalDate d=LocalDate.parse("26 08 1984",f1); 
System.out.println(d); //prints "1984-08-26" 

Nhưng tôi không thể làm tương tự với LocalTime. Đoạn mã này:

DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm"); 
LocalTime t=LocalTime.parse("11 08",f2); //exception here 
System.out.println(t); 

Ném một DateTimeParseException: sai

Exception in thread "main" java.time.format.DateTimeParseException: Text '11 08' could not be parsed: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO 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.LocalTime.parse(Unknown Source) 
    at com.mui.cert.Main.<init>(Main.java:21) 
    at com.mui.cert.Main.main(Main.java:12) 
Caused by: java.time.DateTimeException: Unable to obtain LocalTime from TemporalAccessor: {MinuteOfHour=8, HourOfAmPm=11},ISO of type java.time.format.Parsed 
    at java.time.LocalTime.from(Unknown Source) 
    at java.time.LocalTime$$Lambda$15/1854731462.queryFrom(Unknown Source) 
    at java.time.format.Parsed.query(Unknown Source) 
    ... 4 more 

Tôi đang làm gì?

Trả lời

14

Nếu bạn sử dụng một định dạng cụ thể, theo đến API:

Chuỗi phải thể hiện thời gian hợp lệ và được phân tích cú pháp bằng cách sử dụng DateTimeFormatter.ISO_LOCAL_TIME.

hh mm 

cho 24h phải

HH mm 

hoặc 12h

kk mm 

Các định dạng xử lý phải có các điều kiện sau:

  • Hai chữ số cho hour- trong ngày. Số này được đệm trước bằng 0 để đảm bảo hai chữ số.
  • Một dấu hai chấm
  • Hai chữ số cho phút-giờ. Số này được đệm trước bằng 0 để đảm bảo hai chữ số.
  • Nếu không có giây thứ hai thì định dạng hoàn tất.
  • Một dấu hai chấm
  • Hai chữ số cho phút thứ hai. Số này được đệm trước bằng 0 để đảm bảo hai chữ số.
  • Nếu nano-of-second bằng 0 hoặc không khả dụng thì định dạng hoàn tất.
  • Dấu thập phân
  • Một đến chín chữ số cho nano giây. Như nhiều chữ số sẽ được sản lượng theo yêu cầu.
+0

Bạn có thể liên kết tài nguyên không? –

+1

Chắc chắn ... đã hoàn tất! :) –

+3

Đó là thú vị, tôi thougth tôi có thể mess vô thời hạn với thứ tự của các yếu tố ... –

1

Bạn cần phải sử dụng vốn HH trong mẫu

DateTimeFormatter f2=DateTimeFormatter.ofPattern("HH mm"); 

hoặc làm điều này, cho clock-hour-of-am-pm bạn cần phải xác định nó.

này cũng nên làm việc

DateTimeFormatter f2=DateTimeFormatter.ofPattern("hh mm a"); 
LocalTime t=LocalTime.parse("11 08 AM",f2); //exception here 
+0

nó hoạt động ... nhưng tại sao? 'h -> clock-hour-of-am-pm' cũng hoạt động! –

+1

Tôi nghĩ rằng phần 'am-pm' là quan trọng - nó có thể đề cập đến hai LocalTimes riêng biệt (một cho am và một cho pm) – Deltharis

2

Sử dụng DateTimeFormatter.ofPattern("kk mm"); trong 12 giờ đồng hồ hoặc DateTimeFormatter.ofPattern("HH mm") cho đồng hồ 24 giờ

Nếu bạn muốn phân tích thời gian với hh bạn phải kết hợp nó wih a nơi bạn xác định AM hoặc PM:

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm a"); 
LocalTime t = LocalTime.parse("11 08 AM", f2); 
2

Trong trường hợp này Unable to obtain LocalTime from TemporalAccessor có nghĩa là nó không thể xác định khoảng cách trong ngày mà chuỗi đã cho biết nghĩa là không có đủ thông tin để xây dựng LocalTime. Đằng sau hậu trường, mã trông giống như mở rộng Java 8 phiên bản này (mà đưa ra một lỗi tương tự):

DateTimeFormatter f2 = DateTimeFormatter.ofPattern("hh mm"); 
TemporalAccessor temporalAccessor = f2.parse("11 08"); 
LocalTime t = temporalAccessor.query(LocalTime::from); 
System.out.println(t); 

Các tài liệu LocalTime::from nói

Việc chuyển đổi sử dụng các truy vấn TemporalQueries.localTime(), trong đó dựa vào việc trích xuất trường NANO_OF_DAY.

Lỗi của bạn cho bạn biết rằng TemporalAccessor chỉ có hai trường, không phải trường nào là trường NANO_OF_DAY. Các mô hình tối thiểu cho phép để lấy một LocalTime sử dụng một DateTimeFormatter là:

DateTimeFormatter.ofPattern("ha"); 
DateTimeFormatter.ofPattern("Ka"); 
DateTimeFormatter.ofPattern("ah"); 
DateTimeFormatter.ofPattern("aK"); 
DateTimeFormatter.ofPattern("k"); 
DateTimeFormatter.ofPattern("H"); 

mô hình của bạn phải chứa ít nhất một trong những chuỗi để có được một lĩnh vực NANO_OF_DAY trong nội TemporalAccessor từ đó một LocalTime có thể được xây dựng.

Các vấn đề liên quan