java.time
Cách tiếp cận hiện đại sử dụng các lớp java.time thay thế các lớp ngày-giờ kế thừa rắc rối được đóng gói trong các phiên bản Java sớm nhất.
Các java.sql.Timestamp
lớp học là một trong những lớp học di sản. Không cần nữa. Thay vào đó, hãy sử dụng Instant
hoặc các lớp java.time khác trực tiếp với cơ sở dữ liệu của bạn bằng JDBC 4.2 trở lên.
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 = myResultSet.getObject( … , Instant.class ) ;
Nếu bạn phải tương tác với một lớp hiện có Timestamp
, hãy chuyển đổi ngay lập tức thành java.time thông qua các phương thức chuyển đổi mới được thêm vào các lớp cũ.
Instant instant = myTimestamp.toInstant() ;
Để điều chỉnh thành múi giờ khác, hãy chỉ định múi giờ làm ZoneId
đối tượng. Chỉ định một tên múi giờ thích hợp trong các định dạng của continent/region
, chẳng hạn như America/Montreal
, Africa/Casablanca
hoặcPacific/Auckland
. Không bao giờ sử dụng các múi giờ giả 3-4 chữ cái, chẳng hạn như EST
hoặc IST
chúng không phải là múi giờ thực, không được tiêu chuẩn hóa và thậm chí không phải là duy nhất (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
Áp dụng cho Instant
để tạo ra một ZonedDateTime
đối tượng.
ZonedDateTime zdt = instant.atZone( z ) ;
Để tạo một chuỗi để hiển thị cho người dùng, hãy tìm kiếm Stack Overflow DateTimeFormatter
để tìm nhiều cuộc thảo luận và ví dụ.
Câu hỏi của bạn thực sự là đi theo hướng khác, từ mục nhập dữ liệu của người dùng đến các đối tượng ngày-giờ. Nói chung, tốt nhất nên chia mục nhập dữ liệu của bạn thành hai phần, ngày và giờ trong ngày.
LocalDate ld = LocalDate.parse( dateInput , DateTimeFormatter.ofPattern( "M/d/uuuu" , Locale.US ) ) ;
LocalTime lt = LocalTime.parse( timeInput , DateTimeFormatter.ofPattern( "H:m a" , Locale.US ) ) ;
Câu hỏi của bạn không rõ ràng. Bạn có muốn diễn giải ngày và giờ do người dùng nhập thành UTC không? Hay ở múi giờ khác?
Nếu bạn muốn nói đến UTC, hãy tạo một OffsetDateTime
với một khoảng bù bằng cách sử dụng hằng số cho UTC ZoneOffset.UTC
,.
OffsetDateTime odt = OffsetDateTime.of( ld , lt , ZoneOffset.UTC ) ;
Nếu bạn muốn nói đến một múi giờ khác, hãy kết hợp cùng với một đối tượng múi giờ, a ZoneId
. Nhưng múi giờ nào? Bạn có thể phát hiện một múi giờ mặc định. Hoặc, nếu quan trọng, bạn phải xác nhận với người dùng để chắc chắn về ý định của họ.
ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ;
Để có được một đối tượng đơn giản hơn luôn ở UTC theo định nghĩa, hãy trích xuất một Instant
.
Instant instant = odt.toInstant() ;
…hoặc là…
Instant instant = zdt.toInstant() ;
Gửi đến cơ sở dữ liệu của bạn.
myPreparedStatement.setObject( … , instant ) ;
Giới thiệu về java.time
Khung java.time được tích hợp sẵn trong Java 8 trở lên. 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 .
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 .