tl; dr
ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate ld =
givenJavaUtilDate.toInstant()
.atZone( z )
.toLocalDate();
LocalDate today = LocalDate.now( z );
LocalDate kwanzaaStart = today.withMonth( Month.DECEMBER ).withDayOfMonth( 26 );
LocalDate kwanzaaStop = kwanzaaStart.plusWeeks( 1 );
Boolean isDateInKwanzaaThisYear = (
( ! today.isBefore( kwanzaaStart ) )
&&
today.isBefore( kwanzaaStop )
)
Mở một nửa
Công việc theo thời gian thường sử dụng phương pháp "Nửa công khai" để xác định khoảng thời gian. Mở đầu là bao gồm trong khi kết thúc là độc quyền . Vì vậy, một tuần bắt đầu từ Thứ Hai sẽ kéo dài đến, nhưng không bao gồm, Thứ Hai tiếp theo.
java.time
Java 8 trở lên đi kèm với java.time
khuôn khổ được tích hợp sẵn. Bổ sung các lớp rắc rối cũ bao gồm java.util.Date/.Calendar
và SimpleDateFormat
. Lấy cảm hứng từ thư viện Joda-Time thành công. Được xác định bởi JSR 310. Được mở rộng bởi dự án ThreeTen-Extra.
An Instant
là một thời điểm trên dòng thời gian ở UTC với độ phân giải nano giây.
Instant
Chuyển đổi các java.util.Date
đối tượng của bạn thành Đối tượng tức thì.
Instant start = myJUDateStart.toInstant();
Instant stop = …
Nếu nhận java.sql.Timestamp
các đối tượng thông qua JDBC từ cơ sở dữ liệu, hãy chuyển đổi sang java.time.Instant theo cách tương tự. A java.sql.Timestamp
đã ở UTC nên không cần lo lắng về múi giờ.
Instant start = mySqlTimestamp.toInstant() ;
Instant stop = …
Lấy thời điểm hiện tại để so sánh.
Instant now = Instant.now();
So sánh bằng cách sử dụng các phương thức isBefore, isAfter và bằng.
Boolean containsNow = ( ! now.isBefore( start ) ) && ( now.isBefore( stop ) ) ;
LocalDate
Có lẽ bạn chỉ muốn làm việc với ngày chứ không phải thời gian trong ngày.
Các LocalDate
lớp đại diện cho một giá trị ngày-chỉ, không có nhiều thời gian trong ngày và không có múi giờ.
LocalDate start = LocalDate.of( 2016 , 1 , 1 ) ;
LocalDate stop = LocalDate.of( 2016 , 1 , 23 ) ;
Để lấy ngày hiện tại, hãy chỉ định múi giờ. Tại bất kỳ thời điểm nào, ngày hôm nay thay đổi theo múi giờ. Ví dụ, một ngày mới ở Paris đến sớm hơn ở Montréal.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
Chúng tôi có thể sử dụng isEqual
, isBefore
và isAfter
phương pháp để so sánh. Trong công việc theo thời gian, chúng tôi thường sử dụng phương pháp Half-Open trong đó phần đầu của khoảng thời gian là bao gồm trong khi phần cuối là độc quyền .
Boolean containsToday = ( ! today.isBefore( start ) ) && ( today.isBefore( stop ) ) ;
Interval
Nếu bạn chọn thêm thư viện ThreeTen-Extra vào dự án của mình, bạn có thể sử dụng Interval
lớp để xác định khoảng thời gian. Lớp đó cung cấp các phương thức để kiểm tra xem khoảng thời gian có chứa , tiếp theo , bao quanh hoặc chồng chéo ngày-giờ / khoảng thời gian khác hay không.
Các Interval
lớp hoạt động trên Instant
các đối tượng. Các Instant
lớp đại diện cho một thời điểm trên Timeline trong UTC với độ phân giải nano giây (lên đến chín (9) chữ số của một phân số thập phân).
Chúng ta có thể điều chỉnh LocalDate
thời điểm cụ thể, thời điểm đầu tiên trong ngày, bằng cách chỉ định múi giờ để lấy a ZonedDateTime
. Từ đó, chúng ta có thể quay lại UTC bằng cách giải nén a Instant
.
ZoneId z = ZoneId.of( "America/Montreal" );
Interval interval =
Interval.of(
start.atStartOfDay( z ).toInstant() ,
stop.atStartOfDay( z ).toInstant() );
Instant now = Instant.now();
Boolean containsNow = interval.contains( now );
Giới thiệu về java.time
Các java.time khung được xây dựng vào Java 8 và sau đó. Những lớp học thay thế cái cũ phiền hà di sản lớp học ngày thời gian như java.util.Date
, Calendar
, & SimpleDateFormat
.
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên di cư đến java.time
các lớp học.
Để tìm hiểu thêm, hãy xem Hướng dẫn Oracle . Và tìm kiếm Stack Overflow để có nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310 .
Lấy các java.time
lớp học ở đâu?
- Java SE 8 và SE 9 trở lên
- Được xây dựng trong.
- Một phần của API Java tiêu chuẩn với một triển khai đóng gói.
- Java 9 bổ sung một số tính năng nhỏ và các bản sửa lỗi.
- Java SE 6 và SE 7
- Phần lớn
java.time
chức năng được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport .
- Android
- Các ThreeTenABP dự án thích nghi ThreeTen-backport (nêu trên) cho Android cụ thể.
- Xem Cách sử dụng… .
Các ThreeTen-Extra dự án mở rộng java.time
với các lớp bổ sung. Dự án này là cơ sở chứng minh cho khả năng bổ sung trong tương lai java.time
. Bạn có thể tìm thấy một số các lớp học hữu ích ở đây chẳng hạn như Interval
, YearWeek
, YearQuarter
, và nhiều hơn nữa .