Như đã đề cập trong phần "Tương thích ngược cho khách hàng cấp dưới" của datetimeoffset tài liệu
, chúng tôi có thể làm việc với các biểu diễn chuỗi của datetimeoffset
các giá trị. Trên thực tế, nếu chúng tôi truy xuất datetimeoffset
với jTDS 1.3.1, chúng ta nhận được một java.lang.String
giá trị của biểu mẫu
YYYY-MM-DD hh:mm:ss[.nnnnnnn] {+|-}hh:mm
Giá trị như vậy có thể được phân tích cú pháp như sau:
// rs is our ResultSet object
String valueRetrieved = rs.getString(1); // e.g., "2016-12-08 12:34:56.7850000 -07:00"
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSSSSSS ZZZZZ");
ZonedDateTime zdt = ZonedDateTime.parse(valueRetrieved, dtf);
Đối với việc viết datetimeoffset
giá trị cho SQL Server, jTDS không thể xử lý bản cập nhật đúng cách bằng .setTimestamp
, ví dụ:trên máy của tôi ...
java.sql.Timestamp ts = java.sql.Timestamp.valueOf("2016-12-08 12:34:56.785"); // local
String tsString = formatTimestampForDateTimeOffset(ts); // (see below)
System.out.printf(" java.sql.TimeStamp value: %s (%d ms since epoch)%n", tsString, ts.getTime());
System.out.println();
System.out.println("Saving via setTimestamp ...");
String sqlUpdate = "UPDATE dtoTable SET dtoCol = ? WHERE id=1";
try (PreparedStatement s = conn.prepareStatement(sqlUpdate)) {
s.setTimestamp(1, ts); // pass the Timestamp itself
s.executeUpdate();
}
String valueRetrieved;
try (
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT dtoCol FROM dtoTable WHERE id=1")) {
rs.next();
valueRetrieved = rs.getString(1);
System.out.printf(" jTDS saved the TimeStamp value as: %s%n", valueRetrieved);
}
... sản xuất ...
java.sql.TimeStamp value: 2016-12-08 12:34:56.785 -07:00 (1481225696785 ms since epoch)
Saving via setTimestamp ...
jTDS saved the TimeStamp value as: 2016-12-08 12:34:56.7870000 +00:00
... không chỉ đặt sai lệch múi giờ thành +00:00 (mà không thay đổi chính giá trị ngày / giờ), nó còn thêm vài mili giây chỉ để giải trí.
Tuy nhiên, nếu chúng tôi chuyển đổi giá trị Dấu thời gian thành Chuỗi được định dạng đúng, ví dụ:...
public static String formatTimestampForDateTimeOffset(java.sql.Timestamp ts) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ZZZZZ");
String s = sdf.format(new Date(ts.getTime()));
// T-SQL *requires* the colon in the timezone offset: -07:00, not -0700
int colonPosition = s.length() - 2;
return s.substring(0, colonPosition) + ":" + s.substring(colonPosition);
}
... và sử dụng .setString
thay vì .setTimestamp
, rồi đến datetimeoffset
giá trị được lưu chính xác:
Saving via setString ...
jTDS saved the formatted String as: 2016-12-08 12:34:56.7850000 -07:00
parsed to ZonedDateTime: 2016-12-08T12:34:56.785-07:00
converted to Instant: 2016-12-08T19:34:56.785Z
converted to java.util.Date: Thu Dec 08 12:34:56 MST 2016