useTimezone एक पुराना समाधान है। MySQL टीम ने हाल ही में setTimestamp/getTimestamp कोड को फिर से लिखा है, लेकिन यह केवल तभी सक्षम होगा जब आप कनेक्शन पैरामीटर useLegacyDatetimeCode=false सेट करते हैं और आप MySQL JDBC कनेक्टर के नवीनतम संस्करण का उपयोग कर रहे हैं। तो उदाहरण के लिए:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
यदि आप mysql-कनेक्टर स्रोत कोड डाउनलोड करते हैं और सेटटाइमस्टैम्प को देखते हैं, तो यह देखना बहुत आसान है कि क्या हो रहा है:
यदि लीगेसी दिनांक समय कोड =असत्य का उपयोग किया जाता है, तो newSetTimestampInternal(...) कहा जाता है। फिर, यदि कैलेंडर newSetTimestampInternal को पास किया गया है, तो NULL है, आपका दिनांक ऑब्जेक्ट डेटाबेस के समय क्षेत्र में स्वरूपित है:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
यह बहुत महत्वपूर्ण है कि कैलेंडर रिक्त है - इसलिए सुनिश्चित करें कि आप इसका उपयोग कर रहे हैं:
setTimestamp(int,Timestamp).
... सेट टाइमस्टैम्प नहीं (इंट, टाइमस्टैम्प, कैलेंडर)।
अब यह स्पष्ट होना चाहिए कि यह कैसे काम करता है। यदि आप एक तारीख बनाते हैं:5 जनवरी, 2011 3:00 पूर्वाह्न अमेरिका/लॉस_एंजेल्स (या जो भी समय क्षेत्र आप चाहते हैं) java.util.Calendar और कॉल सेटटाइमस्टैम्प (1, myDate) का उपयोग करके, तो यह आपकी तिथि लेगा, SimpleDateFormat का उपयोग करें इसे डेटाबेस समय क्षेत्र . में प्रारूपित करने के लिए . इसलिए यदि आपका DB अमेरिका/न्यू_यॉर्क में है, तो यह डालने के लिए स्ट्रिंग '2011-01-05 6:00:00' का निर्माण करेगा (चूंकि NY LA से 3 घंटे आगे है)।
दिनांक पुनर्प्राप्त करने के लिए, getTimestamp(int) (कैलेंडर के बिना) का उपयोग करें। एक बार फिर यह दिनांक बनाने के लिए डेटाबेस समय क्षेत्र का उपयोग करेगा।
नोट:वेबसर्वर समय क्षेत्र अब पूरी तरह अप्रासंगिक है! यदि आप useLegacyDatetimecode को गलत पर सेट नहीं करते हैं, तो वेबसर्वर समय क्षेत्र का उपयोग स्वरूपण के लिए किया जाता है - बहुत सारे भ्रम को जोड़ना।
नोट:
यह संभव है MySQL मेरी शिकायत है कि सर्वर समय क्षेत्र अस्पष्ट है। उदाहरण के लिए, यदि आपका डेटाबेस ईएसटी का उपयोग करने के लिए सेट है, तो जावा में कई संभावित ईएसटी समय क्षेत्र हो सकते हैं, इसलिए आप इसे MySQL-कनेक्टर के लिए यह बताकर स्पष्ट कर सकते हैं कि डेटाबेस समय क्षेत्र क्या है:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
आपको ऐसा केवल तभी करना होगा जब वह शिकायत करे।