Joda-Thời gian
Đối với việc thêm một phụ thuộc, tôi sợ java.util.Date & .CalWiki thực sự tệ đến mức điều đầu tiên tôi làm cho bất kỳ dự án mới nào là thêm thư viện Joda-Time. Trong Java 8, bạn có thể sử dụng gói java.time mới, lấy cảm hứng từ Joda-Time.
Cốt lõi của Joda-Time là DateTime
lớp học. Không giống như java.util.Date, nó hiểu múi giờ được chỉ định ( DateTimeZone
). Khi chuyển đổi từ juDate, chỉ định một vùng.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTimeQuébec = new DateTime( date , zone );
LocalDate
Một cách để xác minh nếu hai lần đất vào cùng một ngày là chuyển đổi thành LocalDate
các đối tượng.
Chuyển đổi đó phụ thuộc vào múi giờ được chỉ định. Để so sánh LocalDate
các đối tượng, chúng phải được chuyển đổi với cùng một vùng.
Đây là một phương pháp tiện ích nhỏ.
static public Boolean sameDate ( DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1 );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( dt1.getZone() ) );
Boolean match = ld1.equals( ld2 );
return match;
}
Tốt hơn sẽ là một đối số khác, chỉ định múi giờ thay vì giả sử sử dụng múi giờ của đối tượng DateTime đầu tiên.
static public Boolean sameDate ( DateTimeZone zone , DateTime dt1 , DateTime dt2 )
{
LocalDate ld1 = new LocalDate( dt1.withZone( zone ) );
// LocalDate determination depends on the time zone.
// So be sure the date-time values are adjusted to the same time zone.
LocalDate ld2 = new LocalDate( dt2.withZone( zone ) );
return ld1.equals( ld2 );
}
Đại diện chuỗi
Một cách tiếp cận khác là tạo một chuỗi đại diện cho phần ngày của mỗi thời gian, sau đó so sánh các chuỗi.
Một lần nữa, múi giờ được chỉ định là rất quan trọng.
DateTimeFormatter formatter = ISODateTimeFormat.date(); // Static method.
String s1 = formatter.print( dateTime1 );
String s2 = formatter.print( dateTime2.withZone( dt1.getZone() ) );
Boolean match = s1.equals( s2 );
return match;
Khoảng thời gian
Giải pháp tổng quát là xác định một khoảng thời gian, sau đó hỏi xem khoảng đó có chứa mục tiêu của bạn không. Mã ví dụ này nằm trong Joda-Time 2.4. Lưu ý rằng các lớp liên quan đến "nửa đêm" không được dùng nữa. Thay vào đó hãy sử dụng withTimeAtStartOfDay
phương pháp. Joda-Time cung cấp ba lớp để thể hiện một khoảng thời gian theo nhiều cách khác nhau: Khoảng thời gian, Thời gian và Thời lượng.
Sử dụng phương pháp "Nửa mở" trong đó phần đầu của nhịp được bao gồm và phần cuối độc quyền.
Múi giờ của mục tiêu có thể khác với múi giờ của khoảng thời gian.
DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
DateTime target = new DateTime( 2012, 3, 4, 5, 6, 7, timeZone );
DateTime start = DateTime.now( timeZone ).withTimeAtStartOfDay();
DateTime stop = start.plusDays( 1 ).withTimeAtStartOfDay();
Interval interval = new Interval( start, stop );
boolean containsTarget = interval.contains( target );
java.time
Java 8 trở lên đi kèm với khung java.time . Lấy cảm hứng từ Joda-Time, được xác định bởi JSR 310 và được mở rộng bởi dự án ThreeTen-Extra. Xem hướng dẫn .
Các nhà sản xuất của Joda-Time đã hướng dẫn tất cả chúng ta chuyển sang java.time ngay khi thuận tiện. Trong khi đó, Joda-Time tiếp tục là một dự án được duy trì tích cực. Nhưng mong đợi công việc trong tương lai chỉ xảy ra trong java.time và ThreeTen-Extra chứ không phải Joda-Time.
Để tóm tắt java.time trong một tóm tắt, An An Instant
là một khoảnh khắc trên dòng thời gian trong UTC. Áp dụng múi giờ ( ZoneId
) để lấy ZonedDateTime
đối tượng. Để di chuyển ra khỏi dòng thời gian, để có được những ý tưởng vô hạn mơ hồ của một ngày thời gian, sử dụng các lớp "địa phương": LocalDateTime
, LocalDate
, LocalTime
.
Logic được thảo luận trong phần Joda-Time của Câu trả lời này áp dụng cho java.time.
Lớp java.util.Date cũ có một toInstant
phương thức mới để chuyển đổi sang java.time.
Instant instant = yourJavaUtilDate.toInstant(); // Convert into java.time type.
Xác định một ngày đòi hỏi một múi giờ.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
Chúng tôi áp dụng đối tượng múi giờ đó Instant
để có được a ZonedDateTime
. Từ đó, chúng tôi trích xuất một giá trị chỉ ngày (a LocalDate
) vì mục tiêu của chúng tôi là so sánh ngày (không phải giờ, phút, v.v.).
ZonedDateTime zdt1 = ZonedDateTime.ofInstant( instant , zoneId );
LocalDate localDate1 = LocalDate.from( zdt1 );
Làm tương tự với java.util.Date
đối tượng thứ hai chúng ta cần so sánh. Tôi sẽ chỉ sử dụng thời điểm hiện tại thay thế.
ZonedDateTime zdt2 = ZonedDateTime.now( zoneId );
LocalDate localDate2 = LocalDate.from( zdt2 );
Sử dụng isEqual
phương pháp đặc biệt để kiểm tra cho cùng một giá trị ngày.
Boolean sameDate = localDate1.isEqual( localDate2 );