जैसा कि datetimeoffset के "डाउन-लेवल क्लाइंट्स के लिए बैकवर्ड कम्पैटिबिलिटी" सेक्शन में बताया गया है दस्तावेज़ीकरण
, हम datetimeoffset
. के स्ट्रिंग अभ्यावेदन के साथ काम कर सकते हैं मूल्य। वास्तव में, यदि हम एक datetimeoffset
. प्राप्त करते हैं jTDS 1.3.1 के साथ मान हमें एक java.lang.String
मिलता है फॉर्म का मूल्य
YYYY-MM-DD hh:mm:ss[.nnnnnnn] {+|-}hh:mm
इस तरह के मान को इस प्रकार पार्स किया जा सकता है:
// 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);
datetimeoffset
writing लिखने के लिए SQL सर्वर के लिए मान, jTDS .setTimestamp
. का उपयोग करके अपडेट को ठीक से संभालने में असमर्थ है , जैसे, मेरी मशीन पर...
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);
}
... उत्पादन करता है ...
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
... जो न केवल गलत तरीके से टाइमज़ोन ऑफ़सेट को +00:00 (दिनांक/समय मान को बदले बिना) पर सेट करता है, यह केवल मनोरंजन के लिए कुछ मिलीसेकंड भी जोड़ता है।
हालांकि, अगर हम टाइमस्टैम्प मान को उचित रूप से स्वरूपित स्ट्रिंग में परिवर्तित करते हैं, उदाहरण के लिए, ...
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);
}
... और .setString
. का उपयोग करें इसके बजाय .setTimestamp
, फिर datetimeoffset
मान सही ढंग से सहेजा गया है:
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