tl; dr
myUtilDate_B
.toInstant()
.equals(
myUtilDate_A.toInstant().plus(24 , ChronoUnit.HOURS)
) // Exactly 24 hours apart.
... và ...
012.
myUtilDate_B
.toInstant()
.isAfter(
myUtilDate_A.toInstant().plus(24 , ChronoUnit.HOURS)
) // Over 24 hours apart.
Ngoài ra ...
Duration.between(myUtilDate_A , myUtilDate_B)
.compareTo(Duration.ofHours(24))
// Returns 0 if exactly 24 hours apart,
// >0 if over 24 hours apart.
java.time
Bạn đặc biệt yêu cầu so sánh hai ngày-lần để hỏi nếu một trong hai:
- Là một trong chính xác 24 giờ muộn hơn
khác
- Có thời gian trễ hơn 24 giờ so với phiên bản khác.
Phương thức compareTo
mà bạn đã đề cập không thực hiện việc này. Nó được thiết kế để chỉ cho biết một khoảnh khắc là như nhau, sau đó, hoặc sớm hơn. Phương pháp này không quan tâm đến các khoảng thời gian cụ thể như 24 giờ.
Bạn đã chỉ định cụ thể rằng ngày không quan trọng. Vì vậy, bạn muốn bỏ qua những bất thường như Daylight Saving Time (DST) làm cho một ngày dài hơn hoặc ngắn hơn 24 giờ.
Vì vậy, chúng tôi có thể làm việc trong UTC. Không cần múi giờ.
Nếu bạn đang đề cập đến java.util.Date
đối tượng, trước tiên hãy chuyển đổi chúng thành đối tượng java.time. Lớp Date
là một phần của các lớp ngày giờ phiền hà cũ, cùng với Calendar
, hiện được thừa kế, được thay thế bởi các lớp java.time.
Tương đương với java.util.Date
là java.time.Instant
. Lớp Instant
đại diện cho một thời điểm trên dòng thời gian trong UTC với độ phân giải nanoseconds (tối đa chín (9) chữ số của một phần thập phân).
Bạn có thể chuyển đổi sang/từ các loại java.time thông qua các phương thức mới được thêm vào các lớp cũ.
Instant start = myUtilDate_Start.toInstant();
Instant stop = myUtilDate_Stop.toInstant();
Xác định khoảng cách chúng tôi quan tâm, trong trường hợp này là hai mươi bốn giờ, làm đối tượng Duration
.
Duration d = Duration.ofHours(24); // We mean literally 24 hours, not a day.
Sử dụng số Duration
để tính giá trị sau 24 giờ. Xác định đơn vị giờ theo ChronoUnit
enum.
Instant target = start.plus(24 , ChronoUnit.HOURS);
Cuối cùng, so sánh giá trị ngày giờ thứ hai. Hãy gọi equals
và isAfter
.
Boolean isExactly24HoursLater = stop.equals(target);
Boolean isOver24HoursLater = stop.isAfter(target);
Về java.time
Khung java.time được xây dựng vào Java 8 và sau đó. Các lớp này thay thế các lớp học ngày giờ legacy phiền hà cũ như java.util.Date
, Calendar
, & SimpleDateFormat
.
Dự án Joda-Time, hiện đang ở maintenance mode, khuyên di chuyển sang java.time.
Để tìm hiểu thêm, hãy xem Oracle Tutorial. Và tìm kiếm Stack Overflow cho nhiều ví dụ và giải thích. Đặc điểm kỹ thuật là JSR 310.
Nơi lấy các lớp java.time?
- Java SE 8 và SE 9 và sau
- Built-in.
- Một phần của API Java chuẩn với gói được triển khai.
- Java 9 thêm một số tính năng và bản sửa lỗi nhỏ.
- Java SE 6 và SE 7
- Hầu hết các chức năng java.time được back-chuyển đến Java 6 & 7 trong ThreeTen-Backport.
- Android
Dự án mở rộng ThreeTen-Extra java.time với các lớp bổ sung. Dự án này là một nền tảng chứng minh cho những bổ sung có thể có trong tương lai vào java.time. Bạn có thể tìm thấy một số lớp học hữu ích tại đây như Interval
, YearWeek
, YearQuarter
và more.
Joda thời gian
UPDATE: Dự án Joda-Time, bây giờ trong maintenance mode, khuyên chuyển đổi sang các lớp java.time. Phần này còn lại ở đây nguyên vẹn cho lịch sử.
Joda-Time làm cho công việc này dễ dàng hơn.
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris");
DateTime dateTimeInQuestion = new DateTime(2014, 1, 2, 3, 4, 5, 6, timeZone); // Or: new DateTime(someJavaDotUtilDotDateObject);
DateTime now = new DateTime(timeZone);
DateTime twentyFourHoursFromNow = now.plusHours(24); // Ignores Daylight Saving Time (DST). If you want to adjust for that, call: plusDays(1) instead.
DateTime isDateTimeInQuestionAfter24HoursFromNow = dateTime.isAfter(twentyFourHoursFromNow);
1 ngày ≠ 24 Hours
Nếu bạn thực sự có nghĩa là để xem xét cùng wall-clock time của ngày hôm sau, gọi plusDays(1)
hơn plusHours(24)
. Joda-Time sau đó điều chỉnh cho Daylight Saving Time (DST) hoặc các dị thường khác. Ví dụ, ở đây tại Hoa Kỳ, điều đó có thể có nghĩa là 25 giờ thay vì 24 giờ vì sự thất thường DST 1 giờ của chúng tôi.
Hãy so sánh Trong vòng 24 giờ
Nếu thực sự có nghĩa là để kiểm tra xem ngày thời gian ở vùng đất câu hỏi trong rằng khoảng 24 giờ thời gian, sử dụng một trong ba lớp Joda thời gian cho nhịp của thời gian: Khoảng thời gian, khoảng thời gian và khoảng thời gian.
Interval interval = new Interval(now, twentyFourHoursFromNow);
boolean isDateTimeInQuestionContainedWithinNext24Hours = interval.contains(dateTimeInQuestion);
Đối với loại so sánh đó, Joda-Time sử dụng logic "Nửa mở". Điều này có nghĩa là ngày bắt đầu là bao gồm trong khi kết thúc là độc quyền. Nói cách khác, so sánh với GREATER THAN OR EQUAL TO (> =) bắt đầu, nhưng LESS THAN (<) kết thúc. Cách tiếp cận này thường có ý nghĩa nhất khi làm việc với ngày giờ.
Bạn có thể làm sáng tỏ? Bạn có nghĩa là 24 giờ, một ngày theo lịch hoặc ý của bạn là "các phân đoạn 24 giờ lân cận"? – cheeken
Tôi không muốn kiểm tra xem đó có phải là ngày hôm sau hay không, tôi muốn kiểm tra xem nó có chính xác sau 24 giờ hay không. –
bạn nghĩ gì về lớp GregorianCalendar? – 11684