tl; dr
java.time.temporal.ChronoUnit.DAYS.between(
earlier.truncatedTo(ChronoUnit.DAYS) ,
later.truncatedTo(ChronoUnit.DAYS)
)
... hoặc ...
java.time.temporal.ChronoUnit.HOURS.between(
earlier.truncatedTo(ChronoUnit.HOURS) ,
later.truncatedTo(ChronoUnit.HOURS)
)
java.time
FYI, dự án Joda-Time hiện đang ở maintenance mode, với đội ngũ tư vấn chuyển đổi sang các java.time lớp .
Tương đương với Joda-Time DateTime
là ZonedDateTime
.
ZoneId z = ZoneId.of("Pacific/Auckland") ;
ZonedDateTime now = ZonedDateTime.now(z) ;
Dường như bạn muốn đếm ngày theo ngày, có nghĩa là bạn muốn bỏ qua thời gian trong ngày. Ví dụ: bắt đầu một phút trước nửa đêm và kết thúc một phút sau nửa đêm sẽ dẫn đến một ngày. Đối với hành vi này, hãy trích xuất một số LocalDate
từ số ZonedDateTime
của bạn. Lớp LocalDate
đại diện cho giá trị chỉ ngày mà không có thời gian trong ngày và không có múi giờ.
LocalDate localDateStart = zdtStart.toLocalDate() ;
LocalDate localDateStop = zdtStop.toLocalDate() ;
Sử dụng ChronoUnit
enum để tính toán ngày trôi qua, đơn vị khác.
long days = ChronoUnit.DAYS.between(localDateStart , localDateStop) ;
Truncate
Đối với bạn hỏi về một cách tổng quát hơn để làm đếm này, nơi bạn quan tâm đồng bằng sông giờ như giờ-of-the-đồng hồ chứ không phải giờ hoàn chỉnh như nhịp-of- thời gian sáu mươi phút, sử dụng phương thức truncatedTo
.
Đây là ví dụ của bạn từ 14:45 đến 15:12 cùng ngày.
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime start = ZonedDateTime.of(2017 , 1 , 17 , 14 , 45 , 0 , 0 , z);
ZonedDateTime stop = ZonedDateTime.of(2017 , 1 , 17 , 15 , 12 , 0 , 0 , z);
long hours = ChronoUnit.HOURS.between(start.truncatedTo(ChronoUnit.HOURS) , stop.truncatedTo(ChronoUnit.HOURS));
Đối với một số ngày theo ngày, cắt xén để ChronoUnit.DAYS
. Dưới đây là ví dụ về sau nửa đêm từ năm phút trước năm phút sau, trong những ngày đã qua là 1
.
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime start = ZonedDateTime.of(2017 , 1 , 17 , 23 , 55 , 0 , 0 , z);
ZonedDateTime stop = ZonedDateTime.of(2017 , 1 , 18 , 00 , 05 , 0 , 0 , z);
long days = ChronoUnit.DAYS.between(start.truncatedTo(ChronoUnit.DAYS) , stop.truncatedTo(ChronoUnit.DAYS));
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 đến các lớp 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?
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.
Bạn có thể cung cấp một trường hợp mẫu với dữ liệu cụ thể mà bạn nghĩ ['Days.daysBetween'] (http://www.joda.org/joda-time/apidocs/org/joda/time/Days.html#daysBetween-org .joda.time.ReadableInstant-org.joda.time.ReadableInstant-) không chính xác? –
@BasilBourque - Ví dụ đã có trong câu trả lời của tôi. –
Khi bạn nói để sử dụng 'Instant', bạn không chỉ nói về' start.toInstant() ', phải không? –