tl; dr
Chuyển đổi các java.util.Date
đối tượng lỗi thời của bạn để thay thế chúng , java.time.Instant
. Sau đó tính thời gian trôi qua là a Duration
.
Duration d =
Duration.between( // Calculate the span of time between two moments as a number of hours, minutes, and seconds.
myJavaUtilDate.toInstant() , // Convert legacy class to modern class by calling new method added to the old class.
Instant.now() // Capture the current moment in UTC. About two and a half hours later in this example.
)
;
d.toString (): PT2H34M56S
d.toMinutes (): 154
d.toMinutesPart (): 34
Định dạng ISO 8601: PnYnMnDTnHnMnS
Tiêu chuẩn hợp lý ISO 8601 định nghĩa một biểu diễn văn bản ngắn gọn của một khoảng thời gian là một số năm, tháng, ngày, giờ, v.v. Tiêu chuẩn gọi như vậy trong một khoảng thời gian . Định dạng là PnYnMnDTnHnMnS
nơi P
có nghĩa là "Thời gian", phần T
tách biệt ngày với phần thời gian và ở giữa là các số được theo sau bởi một chữ cái.
Ví dụ:
P3Y6M4DT12H30M5S
ba năm, sáu tháng, bốn ngày, mười hai giờ, ba mươi phút và năm giây
PT4H30M
Bốn giờ rưỡi
java.time
Các java.time khuôn khổ xây dựng vào Java 8 và sau đó chiếm chỗ cũ phiền hà java.util.Date
/ java.util.Calendar
lớp. Các lớp mới được lấy cảm hứng từ khuôn khổ Joda-Time rất thành công , dự định là người kế thừa của nó, tương tự về khái niệm nhưng được tái kiến trúc. Được xác định bởi JSR 310 . Mở rộng bởi dự án ThreeTen-Extra . Xem hướng dẫn .
Chốc lát
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).
Instant instant = Instant.now() ; // Capture current moment in UTC.
Tốt nhất để tránh các lớp kế thừa như Date
/ Calendar
. Nhưng nếu bạn phải tương tác với mã cũ chưa được cập nhật lên java.time , hãy chuyển đổi qua lại. Gọi các phương thức chuyển đổi mới được thêm vào các lớp cũ. Để chuyển từ a java.util.Date
sang an Instant
, hãy gọi Date::toInstant
.
Instant instant = myJavaUtilDate.toInstant() ; // Convert from legacy `java.util.Date` class to modern `java.time.Instant` class.
Khoảng thời gian
Các lớp java.time đã chia ý tưởng này đại diện cho một khoảng thời gian là một số năm, tháng, ngày, giờ, phút, giây thành hai nửa:
Period
trong nhiều năm, tháng, ngày
Duration
cho ngày, giờ, phút, giây
Đây là một ví dụ.
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now ( zoneId );
ZonedDateTime future = now.plusMinutes ( 63 );
Duration duration = Duration.between ( now , future );
Đổ vào bàn điều khiển.
Cả hai Period
và Duration
sử dụng tiêu chuẩn ISO 8601 để tạo đại diện Chuỗi cho giá trị của chúng.
System.out.println ( "now: " + now + " to future: " + now + " = " + duration );
ngay bây giờ: 2015-11-26T00: 46: 48.016-05: 00 [America / Montreal] tới tương lai: 2015-11-26T00: 46: 48.016-05: 00 [America / Montreal] = PT1H3M
Java 9 thêm các phương thức để Duration
có được phần ngày, phần giờ, phần phút và phần giây.
Bạn có thể nhận được tổng số ngày hoặc giờ hoặc phút hoặc giây hoặc mili giây hoặc nano giây trong toàn bộ Thời lượng.
long totalHours = duration.toHours();
Trong Java 9, Duration
lớp nhận được các phương thức mới để trả về các phần khác nhau của ngày, giờ, phút, giây, mili giây / nano giây. Gọi to…Part
phương pháp: toDaysPart()
, toHoursPart()
, và vân vân.
ChronoUnit
Nếu bạn chỉ quan tâm đến độ chi tiết thời gian lớn hơn đơn giản hơn, chẳng hạn như số ngày trôi qua, hãy sử dụng ChronoUnit
enum.
long daysElapsed = ChronoUnit.DAYS.between( earlier , later );
Một vi dụ khac.
Instant now = Instant.now();
Instant later = now.plus( Duration.ofHours( 2 ) );
…
long minutesElapsed = ChronoUnit.MINUTES.between( now , later );
120
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 chuyển đổi sang java.time.
Để tìm hiểu thêm, xem Hướng dẫn Oracle . 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 để có được các lớp java.time?
- 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 việc triển khai đi kèm.
- Java 9 thêm một số tính năng nhỏ và sửa lỗi.
- Java SE 6 và SE 7
- Phần lớn chức năng java.time được chuyển ngược lại sang Java 6 & 7 trong ThreeTen-Backport .
- Android
Các ThreeTen-Extra dự án mở rộng 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 các bổ sung có thể trong tương lai cho 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 .
Joda-Thời gian
CẬP NHẬT: Dự án Joda-Time hiện đang ở chế độ bảo trì , với nhóm tư vấn di chuyển sang các lớp java.time . Tôi để phần này nguyên vẹn cho lịch sử.
Thư viện Joda-Time sử dụng ISO 8601 cho các mặc định của nó. Period
Lớp của nó phân tích cú pháp và tạo ra các chuỗi PnYnMnDTnHnMnS này.
DateTime now = DateTime.now(); // Caveat: Ignoring the important issue of time zones.
Period period = new Period( now, now.plusHours( 4 ).plusMinutes( 30));
System.out.println( "period: " + period );
Riders:
period: PT4H30M