tl; dr
Sử dụng java.time.Instant
lớp để phân tích văn bản theo định dạng ISO 8601 tiêu chuẩn, thể hiện một khoảnh khắc trong UTC.
Instant.parse( "2010-10-02T12:23:23Z" )
ISO 8601
Định dạng đó được xác định theo tiêu chuẩn ISO 8601 cho các định dạng chuỗi thời gian.
Cả hai:
Theo mặc định, sử dụng các định dạng ISO 8601 để phân tích cú pháp và tạo chuỗi.
Nói chung, bạn nên tránh sử dụng các lớp java.util.Date /.CalWiki & java.text.SimpleDateFormat cũ vì chúng rất rắc rối, khó hiểu và thiếu sót. Nếu cần để tương tác, bạn có thể chuyển đổi qua lại.
java.time
Được tích hợp vào Java 8 trở lên là khung công tác java.time mới . Lấy cảm hứng từ Joda-Time , được định nghĩa bởi JSR 310 và được mở rộng bởi dự án ThreeTen-Extra .
Instant instant = Instant.parse( "2010-10-02T12:23:23Z" ); // `Instant` is always in UTC.
Chuyển sang lớp cũ.
java.util.Date date = java.util.Date.from( instant ); // Pass an `Instant` to the `from` method.
Múi giờ
Nếu cần, bạn có thể chỉ định múi giờ.
ZoneId zoneId = ZoneId.of( "America/Montreal" ); // Define a time zone rather than rely implicitly on JVM’s current default time zone.
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); // Assign a time zone adjustment from UTC.
Đổi.
java.util.Date date = java.util.Date.from( zdt.toInstant() ); // Extract an `Instant` from the `ZonedDateTime` to pass to the `from` method.
Joda-Thời gian
CẬP NHẬT: Dự án Joda-Time hiện đang ở chế độ bảo trì. Nhóm tư vấn di chuyển đến các lớp java.time .
Dưới đây là một số mã ví dụ trong Joda-Time 2.8.
org.joda.time.DateTime dateTime_Utc = new DateTime( "2010-10-02T12:23:23Z" , DateTimeZone.UTC ); // Specifying a time zone to apply, rather than implicitly assigning the JVM’s current default.
Chuyển sang lớp cũ. Lưu ý rằng múi giờ được chỉ định bị mất khi chuyển đổi, vì juDate không thể được chỉ định múi giờ.
java.util.Date date = dateTime_Utc.toDate(); // The `toDate` method converts to old class.
Múi giờ
Nếu cần, bạn có thể chỉ định múi giờ.
DateTimeZone zone = DateTimeZone.forID( "America/Montreal" );
DateTime dateTime_Montreal = dateTime_Utc.withZone ( zone );
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, 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 .
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 bạn. 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.
Nơi để có được các lớp java.time?
- Java SE 8 , Java SE 9 và mới hơ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à Java 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 phiên bản sau của triển khai gói Android của các lớp java.time.
- Đối với Android trước đó (<26), các ThreeTenABP dự án thích nghi ThreeTen-backport (nêu trên). Xem Cách sử dụng ThreeTenABP .
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 .