tl; dr
Chỉ sử dụng các lớp java.time hiện đại . Không bao giờ sử dụng các lớp học di sản khủng khiếp như SimpleDateFormat
, Date
hoặc java.sql.Timestamp
.
ZonedDateTime // Represent a moment as perceived in the wall-clock time used by the people of a particular region ( a time zone).
.now( // Capture the current moment.
ZoneId.of( "Africa/Tunis" ) // Specify the time zone using proper Continent/Region name. Never use 3-4 character pseudo-zones such as PDT, EST, IST.
) // Returns a `ZonedDateTime` object.
.format( // Generate a `String` object containing text representing the value of our date-time object.
DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )
) // Returns a `String`.
Hoặc sử dụng múi giờ mặc định hiện tại của JVM .
ZonedDateTime
.now( ZoneId.systemDefault() )
.format( DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" ) )
java.time & JDBC 4.2
Cách tiếp cận hiện đại sử dụng các lớp java.time như đã thấy ở trên.
Nếu trình điều khiển JDBC của bạn tuân thủ JDBC 4.2 , bạn có thể trao đổi trực tiếp các đối tượng java.time với cơ sở dữ liệu. Sử dụng PreparedStatement::setObject
và ResultSet::getObject
.
Chỉ sử dụng java.sql cho trình điều khiển trước JDBC 4.2
Nếu trình điều khiển JDBC của bạn chưa tuân thủ JDBC 4.2 để hỗ trợ các loại java.time , bạn phải quay lại sử dụng các lớp java.sql.
Lưu trữ dữ liệu.
OffsetDateTime odt = OffsetDateTime.now( ZoneOffset.UTC ) ; // Capture the current moment in UTC.
myPreparedStatement.setObject( … , odt ) ;
Lấy dữ liệu.
OffsetDateTime odt = myResultSet.getObject( … , OffsetDateTime.class ) ;
Các loại java.sql, chẳng hạn như java.sql.Timestamp
, chỉ nên được sử dụng để chuyển vào và ra khỏi cơ sở dữ liệu. Chuyển đổi ngay lập tức sang các loại java.time trong Java 8 trở lên.
java.time.Instant
Một java.sql.Timestamp
bản đồ đến một java.time.Instant
, một khoảnh khắc trên dòng thời gian trong UTC. Lưu ý phương thức chuyển đổi mới toInstant
được thêm vào lớp cũ.
java.sql.Timestamp ts = myResultSet.getTimestamp( … );
Instant instant = ts.toInstant();
Múi giờ
Áp dụng múi giờ mong muốn / dự kiến ( ZoneId
) để có được a ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Chuỗi định dạng
Sử dụng a DateTimeFormatter
để tạo chuỗi của bạn. Các mã mẫu tương tự như mã java.text.SimpleDateFormat
nhưng không chính xác, vì vậy hãy đọc tài liệu cẩn thận.
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" );
String output = zdt.format( formatter );
Định dạng cụ thể này không rõ ràng về ý nghĩa chính xác của nó vì nó không có bất kỳ dấu hiệu nào của offset-từ-UTC hoặc múi giờ.
ISO 8601
Nếu bạn có bất kỳ lời nói nào trong vấn đề này, tôi khuyên bạn nên cân nhắc sử dụng các định dạng ISO 8601 tiêu chuẩn thay vì tự lăn. Định dạng tiêu chuẩn khá giống với định dạng của bạn. Ví dụ :
2016-02-20T03:26:32+05:30
.
Các lớp java.time sử dụng các định dạng tiêu chuẩn này theo mặc định, do đó không cần chỉ định một mẫu. Các ZonedDateTime
lớp mở rộng định dạng chuẩn bằng cách thêm tên của múi giờ (một cải tiến khôn ngoan).
String output = zdt.toString(); // Example: 2007-12-03T10:15:30+01:00[Europe/Paris]
Chuyển đổi sang java.sql
Bạn có thể chuyển đổi từ java.time trở lại java.sql.Timestamp
. Trích xuất một Instant
từ ZonedDateTime
.
Các phương thức mới đã được thêm vào các lớp cũ để tạo điều kiện chuyển đổi sang / từ các lớp java.time.
java.sql.Timestamp ts = java.sql.Timestamp.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, 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?
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 .