2015-01-15 22 views
11

Tôi có hai trường hợp của lớp Instant từ java.time như thế này:Kiểm tra xem hai trường hợp "tức thì" là vào cùng ngày trong Java 8

Instant instant1 = Instant.now(); 
Instant instant2 = Instant.now().plus(5, ChronoUnit.HOURS); 

Bây giờ tôi muốn kiểm tra xem hai trường hợp trong số Instant thực sự là cùng ngày (ngày, tháng và năm). Dễ dàng Tôi nghĩ, chúng ta hãy chỉ sử dụng bóng mới LocalDate và phổ from phương pháp tĩnh:

LocalDate localdate1 = LocalDate.from(instant1); 
LocalDate localdate2 = LocalDate.from(instant2); 

if (localdate1.equals(localdate2)) { 
    // All the awesome 
} 

Trừ rằng phương pháp phổ from không phải là quá phổ biến và Java phàn nàn khi chạy với một ngoại lệ:

java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: 2014-11-04T18:18:12Z of type java.time.Instant 

Để lại cho tôi trở lại hình vuông 1.

Kiểm tra cách nhanh nhất/được khuyến nghị nếu hai trường hợp Instant thực sự có cùng ngày (có cùng ngày, tháng và năm) r)?

+0

Nói cách khác, bạn cần một cái gì đó mà làm việc với Java 7? Còn Java 6 hoặc Java 5 thì sao? Làm thế nào đến nay bạn cần điều này để làm việc? – markspace

+0

Điều này chỉ có để làm việc cho Java 8 trong trường hợp của tôi, nên có lẽ đã xác định rằng – Robin

+0

Làm thế nào về việc sử dụng 'instant1.truncatedTo (ChronoUnit.DAYS)'? Làm tương tự trên instant2 và so sánh các trường hợp cắt ngắn? – dcsohl

Trả lời

11

Lớp Instant không hoạt động với đơn vị thời gian của con người, chẳng hạn như năm, tháng hoặc ngày. Nếu bạn muốn thực hiện các phép tính trong các đơn vị đó, bạn có thể chuyển đổi Instant thành một lớp khác, chẳng hạn như LocalDateTime hoặc ZonedDateTime, bằng cách liên kết Instant với một khoảng thời gian . Sau đó, bạn có thể truy cập vào giá trị trong các đơn vị mong muốn.

http://docs.oracle.com/javase/tutorial/datetime/iso/instant.html

Vì vậy tôi đề nghị các đoạn mã sau:

LocalDate ld1 = LocalDateTime.ofInstant(instant1, ZoneId.systemDefault()).toLocalDate(); 
LocalDate ld2 = LocalDateTime.ofInstant(instant2, ZoneId.systemDefault()).toLocalDate(); 

if (ld1.isEqual(ld2)) { 
    System.out.println("blubb"); 
} 

Hoặc bạn có thể sử dụng

instant.atOffset(ZoneOffset.UTC).toLocalDate(); 
Các vấn đề liên quan