2015-09-28 13 views
6

Tôi tạo ra phương pháp tĩnh tuyệt vời này ngày hôm qua, và nó chỉ làm việc tốt - hôm quaParsing ISO_INSTANT và ngày tương tự như Time Strings

Tuy nhiên, ngày nay nó mang lại cho tôi lỗi này. Tôi đoán nó là quá nhiều 0s trước khi Z.

Bất kỳ ai cũng có thể giới thiệu cách phân tích cú pháp theo cách ngắn gọn (Java 8) kiểu này là String ngày định dạng - lưu ý rằng nó hoạt động ngày hôm qua quá, vì vậy ISO_INSTANT cũng định dạng hợp lệ cho String?

Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {NanoOfSecond=0, InstantSeconds=1443451604, MilliOfSecond=0, MicroOfSecond=0},ISO of type java.time.format.Parsed 
at java.time.LocalDate.from(LocalDate.java:368) 
at java.time.LocalDateTime.from(LocalDateTime.java:456) 
... 9 more 

ném một ngoại lệ về thời gian đầu vào: "2015-09-28T14: 46: 44.000000Z"

/** 
* 
* @param time the time in RFC3339 format (e.g. "2013-07-03T14:30:38Z") 
* @return 
*/ 
public static LocalDateTime parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return LocalDateTime.from(f.parse(time)); 
} 

enter image description here

+0

ISO_INSTANT không hỗ trợ các múi giờ, có thể được cố định với một cái gì đó như: 'Instant.from (DateTimeFormatter.ISO_DATE_TIME.parse ("2017-04-20T00: 00: 00 + 04: 00 "))' –

Trả lời

11

Bạn đang phân tích một chuỗi đó là phù hợp với ngay lập tức ISO do đó bạn cần lưu trữ kết quả theo số Instant thay vì LocalDateTime:

public static Instant parseTimeINSTANT(String time) { 
    DateTimeFormatter f = DateTimeFormatter.ISO_INSTANT; 
    return Instant.from(f.parse(time)); // could be written f.parse(time, Instant::from); 
} 

Lưu ý rằng trình định dạng này xử lý chính xác các giây phân số để bạn không cần phải loại bỏ chúng. Trích dẫn DateTimeFormatter.ISO_INSTANT Javadoc (nhấn mạnh mỏ):

Khi phân tích cú pháp, thời gian đến trường ít nhất giây là bắt buộc. Số thập phân từ 0 đến 9 được phân tích cú pháp.

Là tại sao nó làm việc ngày hôm qua và không phải hôm nay, tôi không có ý tưởng ...

+0

cảm ơn, và nó là ok để làm 'LocalDateTime.from (tức thời);'? mã của tôi thực sự mong đợi định dạng LocalDateTime. nano giây không quan trọng – ycomp

+2

@ycomp Bạn có thể chuyển đổi Instant thành LocalDateTime, xem [answer] (http://stackoverflow.com/a/19726814/1743880). – Tunaki

+0

có lẽ tôi vừa mới viết nó ngày hôm qua, nghĩ rằng tôi đã chạy nó nhưng không bao giờ chạy nó cho đến ngày hôm nay - Tôi không thể nhìn thấy bất cứ điều gì trong mã của tôi cho thấy tôi đã có thể chạy nó ngày hôm qua .. vì vậy tôi đoán nó không bao giờ thực sự làm việc theo cách Ban đầu tôi đã mã hóa nó – ycomp

3

Chỉ vì lợi ích của việc giúp đỡ bất cứ ai nhìn thấy câu hỏi này sau.

Bạn cần phải phân tích cú pháp ISO Date thành Instant, chuyển đổi nó thành Instant Đối tượng và sau đó tạo một LocalDateTime từ nó cung cấp Id khu vực. Tôi đang đặt Id vùng của UTC tại đây.

Mã này là như sau

public static LocalDateTime getISODate(String dateString) { 
    DateTimeFormatter isoFormatter = DateTimeFormatter.ISO_INSTANT; 
    Instant dateInstant = Instant.from(isoFormatter.parse(dateString)); 
    LocalDateTime date = LocalDateTime.ofInstant(dateInstant, ZoneId.of(ZoneOffset.UTC.getId())); 

    return date; 
} 
Các vấn đề liên quan