tl; dr
Instant.now()
java.time
Các lớp date-time cũ rắc rối đi kèm với các phiên bản Java sớm nhất đã được thay thế bằng các lớp java.time được tích hợp trong Java 8 trở lên. Xem Hướng dẫn Oracle . Phần lớn chức năng đã được chuyển ngược sang Java 6 & 7 trong ThreeTen-Backport và được điều chỉnh thêm cho Android trong ThreeTenABP .
Instant
An Instant
đại diện cho một thời điểm trên dòng thời gian theo giờ UTC với độ phân giải lên đến nano giây .
Instant instant = Instant.now();
Các toString
phương pháp tạo ra một đối tượng String bằng văn bản đại diện cho các giá trị ngày tháng thời gian bằng một trong những tiêu chuẩn ISO 8601 định dạng.
String output = instant.toString();
2016-06-27T19: 15: 25.864Z
Các Instant
lớp là một lớp xây dựng khối cơ bản trong java.time. Đây nên là bài học của bạn khi xử lý ngày-giờ vì thông thường, phương pháp hay nhất là theo dõi, lưu trữ và trao đổi các giá trị ngày-giờ trong UTC.
OffsetDateTime
Nhưng Instant
có những hạn chế như không có tùy chọn định dạng để tạo chuỗi ở các định dạng thay thế. Để linh hoạt hơn, hãy chuyển đổi từ Instant
sang OffsetDateTime
. Chỉ định offset-from-UTC . Trong java.time có nghĩa là một ZoneOffset
đối tượng. Ở đây chúng tôi muốn gắn bó với UTC (+00) để có thể sử dụng hằng số thuận tiện ZoneOffset.UTC
.
OffsetDateTime odt = instant.atOffset( ZoneOffset.UTC );
2016-06-27T19: 15: 25.864Z
Hoặc bỏ qua Instant
lớp học.
OffsetDateTime.now( ZoneOffset.UTC )
Bây giờ với một OffsetDateTime
đối tượng trong tay, bạn có thể sử dụng DateTimeFormatter
để tạo các đối tượng Chuỗi với văn bản ở các định dạng thay thế. Tìm kiếm Tràn ngăn xếp để biết nhiều ví dụ về cách sử dụng DateTimeFormatter
.
ZonedDateTime
Khi bạn muốn hiển thị thời gian trên đồng hồ treo tường cho một số múi giờ cụ thể, hãy áp dụng a ZoneId
để lấy a ZonedDateTime
.
Trong ví dụ này, chúng tôi áp dụng múi giờ Montréal. Vào mùa hè, dưới thời gian vô nghĩa của Giờ tiết kiệm ánh sáng ban ngày (DST) , vùng này có giá trị bù đắp -04:00
. Vì vậy, lưu ý cách thời gian trong ngày sớm hơn bốn giờ trong đầu ra, 15
thay vì 19
giờ. Instant
và ZonedDateTime
cả hai đều đại diện cho cùng một thời điểm đồng thời, chỉ được nhìn qua hai thấu kính khác nhau.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
2016-06-27T15: 15: 25.864-04: 00 [Mỹ / Montreal]
Chuyển đổi
Mặc dù bạn nên tránh các lớp ngày-giờ cũ, nhưng nếu cần, bạn có thể chuyển đổi bằng cách sử dụng các phương thức mới được thêm vào các lớp cũ. Ở đây chúng tôi sử dụng java.util.Date.from( Instant )
và java.util.Date::toInstant
.
java.util.Date utilDate = java.util.Date.from( instant );
Và đi theo hướng khác.
Instant instant= utilDate.toInstant();
Tương tự, hãy tìm kiếm các phương thức mới được thêm vào GregorianCalendar
(lớp con của Calendar
) để chuyển đổi sang và từ java.time.ZonedDateTime
.
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
.
Để 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 .
Các Joda thời gian dự án, bây giờ trong chế độ bảo trì , khuyên chuyển đổi sang các java.time lớp.
Bạn có thể trao đổi các đối tượng java.time trực tiếp với cơ sở dữ liệu của mình. Sử dụng trình điều khiển JDBC tương thích với JDBC 4.2 trở lên. Không cần chuỗi, không cần java.sql.*
lớp. Hibernate 5 & JPA 2.2 hỗ trợ java.time .
Lấy các lớp java.time ở đâu?
java.util.Date
không bao giờ là ngày máy cục bộ. Nó luôn được định nghĩa là mili giây trôi qua kể từ 1970-01-01 liên quan đến UTC + 00: 00. Có thể hành vi của phương thức của nótoString()
làm bạn bối rối khi thực sự sử dụng một đại diện trong múi giờ địa phương.