Câu trả lời:
Bởi Timestamp
, tôi đoán bạn có nghĩa là java.sql.Timestamp
. Bạn sẽ nhận thấy rằng lớp này có một hàm tạo chấp nhận một long
đối số. Bạn có thể phân tích cú pháp này bằng cách sử dụng DateFormat
lớp:
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
Date date = dateFormat.parse("23/09/2007");
long time = date.getTime();
new Timestamp(time);
java.util.Date
, java.util.Calendar
và java.text.SimpleDateFormat
bây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Cái này thì sao?
java.sql.Timestamp timestamp = java.sql.Timestamp.valueOf("2007-09-23 10:10:10.0");
Ý bạn là gì dấu thời gian? Nếu ý bạn là mili giây kể từ kỷ nguyên Unix:
GregorianCalendar cal = new GregorianCalendar(2007, 9 - 1, 23);
long millis = cal.getTimeInMillis();
Nếu bạn muốn một đối tượng java.sql.Timestamp thực tế:
Timestamp ts = new Timestamp(millis);
Calendar.SEPTEMBER
java.sql.Timestamp.from (
LocalDate.of ( 2007 , 9 , 23 )
.atStartOfDay( ZoneId.of ( "America/Montreal" ) )
.toInstant()
)
Hãy cập nhật trang này bằng cách hiển thị mã bằng khung công tác java.time được tích hợp trong Java 8 trở lên.
Các lớp mới này được 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 . Họ thay thế các lớp date-time cũ nổi tiếng rắc rối được đóng gói bằng các phiên bản Java ban đầu.
Trong java.time, an Instant
là một thời điểm trên dòng thời gian theo giờ UTC. A ZonedDateTime
là một Instant được điều chỉnh thành múi giờ ( ZoneId
).
Múi giờ là rất quan trọng ở đây. September 23, 2007
Không thể dịch ngày của thành một thời điểm trên dòng thời gian mà không áp dụng múi giờ. Hãy cân nhắc rằng một ngày mới ở Paris đến sớm hơn ở Montréal, nơi nó vẫn là “ngày hôm qua”.
Ngoài ra, java.sql.Timestamp đại diện cho cả ngày và giờ trong ngày. Vì vậy, chúng ta phải tiêm một thời gian trong ngày để đi cùng với ngày. Chúng tôi giả định rằng bạn muốn khoảnh khắc đầu tiên trong ngày là thời gian trong ngày. Lưu ý rằng đây không phải lúc nào cũng là lúc 00:00:00.0
vì Giờ tiết kiệm ánh sáng ban ngày và có thể có những bất thường khác.
Lưu ý rằng không giống như lớp java.util.Date cũ và không giống như Joda-Time, các kiểu java.time có độ phân giải là nano giây chứ không phải mili giây. Điều này phù hợp với độ phân giải của java.sql.Timestamp.
Lưu ý rằng java.sql.Timestamp có thói quen xấu là áp dụng ngầm múi giờ mặc định hiện tại của JVM cho giá trị ngày-giờ của nó khi tạo biểu diễn chuỗi thông qua toString
phương thức của nó . Ở đây bạn thấy America/Los_Angeles
múi giờ của tôi được áp dụng. Ngược lại, các lớp java.time lành mạnh hơn, sử dụng các định dạng ISO 8601 tiêu chuẩn .
LocalDate d = LocalDate.of ( 2007 , 9 , 23 ) ;
ZoneId z = ZoneId.of ( "America/Montreal" ) ;
ZonedDateTime zdt = d.atStartOfDay( z ) ;
Instant instant = zdt.toInstant() ;
java.sql.Timestamp ts = java.sql.Timestamp.from ( instant ) ;
Đổ vào bảng điều khiển.
System.out.println ( "d: " + d + " = zdt: " + zdt + " = instant: " + instant + " = ts: " + ts );
Khi chạy.
d: 2007-09-23 = zdt: 2007-09-23T00: 00-04: 00 [Châu Mỹ / Montreal] = tức thì: 2007-09-23T04: 00: 00Z = ts: 2007-09-22 21:00: 00.0
Nhân tiện, kể từ JDBC 4.2, bạn có thể sử dụng trực tiếp các loại java.time. Không cần java.sql.Timestamp
.
PreparedStatement.setObject
ResultSet.getObject
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 .
Bạn cũng có thể làm như sau:
// untested
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 23);// I might have the wrong Calendar constant...
cal.set(Calendar.MONTH, 8);// -1 as month is zero-based
cal.set(Calendar.YEAR, 2009);
Timestamp tstamp = new Timestamp(cal.getTimeInMillis());
Theo API, hàm tạo chấp nhận năm, tháng, v.v. không được dùng nữa. Thay vào đó, bạn nên sử dụng Constructor chấp nhận một long. Bạn có thể sử dụng triển khai Lịch để xây dựng ngày bạn muốn và truy cập vào biểu diễn thời gian dài hạn, chẳng hạn với phương thức getTimeInMillis .
Vì lợi ích hoàn chỉnh, cũng là một giải pháp với Joda-Time phiên bản 2.5 và DateTime
lớp của nó :
new Timestamp(new DateTime(2007, 9, 23, 0, 0, DateTimeZone.forID( "America/Montreal" )).getMillis())
DateTime
đối tượng. Điều đó có nghĩa là kết quả của bạn sẽ khác nhau trên các máy tính khác nhau hoặc cấu hình của cài đặt hệ điều hành máy chủ hoặc JVM. Để có kết quả có thể đoán trước, hãy chuyển múi giờ cho hàm tạo đó DateTime
. Chọn tên múi giờ thích hợp cho ý định của bạn. Ví dụ, DateTimeZone.forID( "America/Montreal" )
hoặc DateTimeZone.UTC
.
DateTime
đối tượng về kỷ nguyên mili giây của nó. Thay thế .toDate().getTime()
bằng .getMillis()
.
DateTimeZone.getDefault()
và chuyển kết quả làm đối số tùy chọn. (Nhân tiện, ditto cho Locale.getDefault()
, cùng một vấn đề về sự mơ hồ của các đối số tùy chọn.)
Một câu trả lời chung chung hơn sẽ là nhập java.util.Date
, sau đó khi bạn cần đặt timestamp
bằng với ngày hiện tại, chỉ cần đặt bằng new Date()
.