tl; dr
Trong UTC :
Instant.now().minus( 1 , ChronoUnit.HOURS )
Hoặc, khoanh vùng:
Instant.now()
.atZone( ZoneId.of ( "America/Montreal" ) )
.minusHours( 1 )
Sử dụng java.time
Java 8 trở lên được tích hợp sẵn khuôn khổ java.time mới .
Instant
Nếu bạn chỉ quan tâm đến UTC (GMT), thì hãy sử dụng Instant
lớp học.
Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );
Đổ vào bảng điều khiển.
System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );
tức thì: 2015-10-29T00: 37: 48.921Z | tức thìHourEarlier: 2015-10-28T23: 37: 48.921Z
Lưu ý làm thế nào ngay lập tức này đã xảy ra để bỏ qua ngày hôm qua.
ZonedDateTime
Nếu bạn quan tâm đến múi giờ, hãy sử dụng ZonedDateTime
lớp học. Bạn có thể bắt đầu với một Instant và gán một múi giờ, một ZoneId
đối tượng. Lớp này xử lý các điều chỉnh cần thiết cho các dị thường như Giờ tiết kiệm ánh sáng ban ngày (DST) .
Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );
Đổ vào bảng điều khiển.
System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );
tức thì: 2015-10-29T00: 50: 30.778Z
zdt: 2015-10-28T20: 50: 30.778-04: 00 [Mỹ / Montreal]
zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [Mỹ / Montreal]
Chuyển đổi
Các lớp java.util.Date/.Calendar cũ hiện đã lỗi thời. Tránh chúng. Chúng nổi tiếng là rắc rối và khó hiểu.
Khi bạn phải sử dụng các lớp cũ để hoạt động với mã cũ chưa được cập nhật cho các loại java.time, hãy gọi các phương thức chuyển đổi. Đây là mã ví dụ đi từ Instant hoặc ZonedDateTime đến java.util.Date.
java.util.Date date = java.util.Date.from( instant );
…hoặc là…
java.util.Date date = java.util.Date.from( zdt.toInstant() );
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 các java.time lớp.
Để 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 .
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.
Lấy các lớp java.time ở đâu?
Các ThreeTen-Extra dự án mở rộng java.time với các lớp bổ sung. Dự án này là cơ sở chứng minh cho những bổ sung có thể có 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 .
mktime
tương đương trong java không? trừ đi 60 phút từ nó?