tl; dr
Các Joda thời gian dự án là trong duy trì chế độ, bây giờ thay thế bởi java.time lớp.
- Chỉ cần sử dụng
java.time.Instant
lớp học.
- Không cần:
LocalDateTime
java.sql.Timestamp
- Dây
Ghi lại khoảnh khắc hiện tại trong UTC.
Instant.now()
Để lưu trữ khoảnh khắc đó trong cơ sở dữ liệu:
myPreparedStatement.setObject( … , Instant.now() ) // Writes an `Instant` to database.
Để lấy lại khoảnh khắc đó từ cơ sở dữ liệu:
myResultSet.getObject( … , Instant.class ) // Instantiates a `Instant`
Để điều chỉnh thời gian đồng hồ treo tường theo múi giờ cụ thể.
instant.atZone( z ) // Instantiates a `ZonedDateTime`
LocalDateTime
là lớp sai
Các câu trả lời khác là đúng, nhưng chúng không chỉ ra rằng đó LocalDateTime
là lớp sai cho mục đích của bạn.
Trong cả java.time và Joda-Time , một LocalDateTime
cách cố ý thiếu bất kỳ khái niệm nào về múi giờ hoặc offset-từ-UTC. Như vậy, nó không đại diện cho một khoảnh khắc, và không phải là một điểm trên dòng thời gian. A LocalDateTime
đại diện cho một ý tưởng sơ bộ về những khoảnh khắc tiềm năng trong khoảng 26-27 giờ.
Sử dụng một LocalDateTime
trong hai khi không xác định vùng / bù (không phải là tình huống tốt) hoặc khi bù vùng không xác định. Ví dụ, Giáng sinh bắt đầu vào thời điểm đầu tiên của ngày 25 tháng 12 năm 2018, sẽ được biểu diễn dưới dạng a LocalDateTime
.
Sử dụng a ZonedDateTime
để thể hiện một khoảnh khắc trong một múi giờ cụ thể. Ví dụ: Giáng sinh bắt đầu ở bất kỳ khu vực cụ thể nào như Pacific/Auckland
hoặc America/Montreal
sẽ được đại diện với một ZonedDateTime
đối tượng.
Trong một khoảnh khắc luôn luôn trong UTC, sử dụng Instant
.
Instant instant = Instant.now() ; // Capture the current moment in UTC.
Áp dụng một múi giờ. Cùng một thời điểm, cùng một điểm trên dòng thời gian, nhưng được xem với thời gian đồng hồ treo tường khác nhau.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ; // Same moment, different wall-clock time.
Vì vậy, nếu tôi chỉ có thể chuyển đổi giữa LocalDate và LocalDateTime,
Không, sai chiến lược. Nếu bạn có giá trị chỉ theo ngày và bạn muốn giá trị theo ngày, bạn phải chỉ định thời gian trong ngày. Thời gian đó có thể không hợp lệ vào ngày đó đối với một khu vực cụ thể - trong trường hợp đó, ZonedDateTime
lớp sẽ tự động điều chỉnh thời gian trong ngày khi cần thiết.
LocalDate ld = LocalDate.of( 2018 , Month.JANUARY , 23 ) ;
LocalTime lt = LocalTime.of( 14 , 0 ) ; // 14:00 = 2 PM.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Nếu bạn muốn khoảnh khắc đầu tiên trong ngày là thời gian trong ngày của mình, hãy để java.time xác định thời điểm đó. Đừng cho rằng ngày bắt đầu lúc 00:00:00. Sự bất thường như Giờ tiết kiệm ánh sáng ban ngày (DST) có nghĩa là ngày có thể bắt đầu vào một thời điểm khác, chẳng hạn như 01:00:00.
ZonedDateTime zdt = ld.atStartOfDay( z ) ;
java.sql.Timestamp
là lớp sai
Đây java.sql.Timestamp
là một phần của các lớp thời gian cũ rắc rối hiện đang là di sản, được thay thế hoàn toàn bởi các lớp java.time . Lớp đó được sử dụng để thể hiện một khoảnh khắc trong UTC với độ phân giải nano giây . Mục đích đó bây giờ được phục vụ với java.time.Instant
.
JDBC 4.2 với getObject
/setObject
Kể từ JDBC 4.2 trở lên, trình điều khiển JDBC của bạn có thể trao đổi trực tiếp các đối tượng java.time với cơ sở dữ liệu bằng cách gọi:
Ví dụ:
myPreparedStatement.setObject( … , instant ) ;
Giáo dục và Giáo dục
Instant instant = myResultSet.getObject( … , Instant.class ) ;
Chuyển đổi di sản ⬌ hiện đại
Nếu bạn phải giao diện với mã cũ chưa được cập nhật lên java.time , hãy chuyển đổi qua lại bằng các phương thức mới được thêm vào các lớp cũ.
Instant instant = myJavaSqlTimestamp.toInstant() ; // Going from legacy class to modern class.
Giáo dục và Giáo dục
java.sql.Timestamp myJavaSqlTimestamp = java.sql.Timestamp.from( instant ) ; // Going from modern class to legacy class.
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 .
java.sql.Timestamp
lớp hiện là di sản, được thay thế bởi các lớp java.time , đặc biệt bởiInstant
.