जॉर्डन, वास्तव में आपके पास सही विचार था। समस्या यह है कि MySQL JDBC ड्राइवर में एक बग है और कैलेंडर तर्क को डिफ़ॉल्ट रूप से पूरी तरह से अनदेखा कर दिया जाता है। वास्तव में क्या हो रहा है यह देखने के लिए रेडीडस्टेटमेंट के स्रोत कोड को देखें।
ध्यान दें कि यह JVM के समय क्षेत्र का उपयोग करके टाइमस्टैम्प को प्रारूपित करता है। यह तभी काम करेगा जब आपका JVM UTC टाइम ज़ोन का उपयोग कर रहा हो। कैलेंडर ऑब्जेक्ट को पूरी तरह से अनदेखा कर दिया गया है।
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss''", Locale.US);
timestampString = this.tsdf.format(x);
MySQL के लिए कैलेंडर तर्क का उपयोग करने के लिए, आपको निम्न कनेक्शन विकल्प के साथ विरासत दिनांक/समय कोड को अक्षम करना होगा:
useLegacyDatetimeCode=false
तो आप इस तरह डेटाबेस से कनेक्ट करते समय इसका इस्तेमाल कर सकते हैं:
String url = "jdbc:mysql://localhost/tz?useLegacyDatetimeCode=false"
यदि आप उपरोक्त लाइन का उपयोग करके लीगेसी डेटाटाइम कोड को अक्षम करते हैं, तो यह आपके टाइमस्टैम्प को लक्षित कैलेंडर के समय क्षेत्र में प्रस्तुत करेगा:
if (targetCalendar != null) {
targetCalendar.setTime(x);
this.tsdf.setTimeZone(targetCalendar.getTimeZone());
timestampString = this.tsdf.format(x);
} else {
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
}
यहाँ क्या हो रहा है यह देखना बहुत आसान है। यदि आप कैलेंडर ऑब्जेक्ट में पास करते हैं, तो यह डेटा को स्वरूपित करते समय इसका उपयोग करेगा। अन्यथा, यह डेटा को प्रारूपित करने के लिए डेटाबेस के समय क्षेत्र का उपयोग करेगा। आश्चर्यजनक रूप से, यदि आप किसी कैलेंडर में पास होते हैं, तो यह समय को दिए गए टाइमस्टैम्प मान (जो व्यर्थ प्रतीत होता है) पर भी सेट कर देगा।