Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

Mysql और java में टाइमज़ोन विसंगति

पृष्ठभूमि:एक आश्चर्यजनक रूप से सामान्य - और बड़ी - यहां तक ​​​​कि शानदार प्रोग्रामर द्वारा साझा की गई गलत धारणा यह है कि समय टिकटों को संग्रहीत किया जाता है (आपके डेटाबेस, दिनांक, कैलेंडर, टाइमस्टैम्प, एट अल में) किसी भी तरह से समय क्षेत्र की जानकारी होती है। वे नहीं करते हैं। 1 जनवरी 1970 UTC की मध्यरात्रि से एक टाइम स्टैम्प (वैसे भी Java 8 तक) को मिलीसेकंड की संख्या के रूप में संग्रहीत किया जाता है। वाक्य का अंत। टाइम ज़ोन सेट करने वाली एकमात्र चीज़ कंप्यूटर को उस टाइम स्टैम्प को मानव पठनीय प्रारूप में बदलने के लिए पर्याप्त जानकारी प्रदान करती है, और इसके विपरीत।

उत्तर:जब आपको संदेह था कि यह एक समय क्षेत्र की समस्या है, आप सही थे . लेकिन जिस कोड को आप सत्यापित करने का प्रयास करते थे, उसमें भी एक समस्या है:

end.setTimeZone(TimeZone.getTimeZone("America/New York"));
pst.setTimestamp(1, new java.sql.Timestamp(end.getTimeInMillis()));

वह setTimeZone कथन का कोई प्रभाव नहीं . है end . में संग्रहीत समय पर , क्योंकि समय पहले ही निर्धारित किया जा चुका है। इसका केवल तभी प्रभाव होता है जब आप बाद में समय संग्रहीत करते हैं, और तब केवल यदि आप कैलेंडर के तरीकों में से एक का उपयोग करते हैं जो समय को मानव पठनीय प्रारूप से परिवर्तित करता है (और setTimeInMillis नहीं) )।

जब आप getTimeInMillis . का उपयोग करते हैं अपने तैयार किए गए स्टेटमेंट पर टाइम स्टैम्प पास करने के लिए, आप सीधे टाइम स्टैम्प को पुनः प्राप्त कर रहे हैं। चूंकि आप इसे मानव प्रारूप में परिवर्तित नहीं कर रहे हैं, एक बार फिर समय क्षेत्र की जानकारी पर ध्यान नहीं दिया जाता है।

जब आप कोशिश करें

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
end.setTime(sdf.parse("2012-10-01 00:00:00"));
pst.setTimestamp(1, new java.sql.Timestamp(end.getTime()));

और

pst.setTimestamp(1, new java.sql.Timestamp(octDate.get(Calendar.YEAR)-1900,octDate.get(Calendar.MONTH),octDate.get(Calendar.DATE),octDate.get(Calendar.HOUR),octDate.get(Calendar.MINUTE),octDate.get(Calendar.SECOND),0));
pst.setTimestamp(2, new java.sql.Timestamp(end.get(Calendar.YEAR)-1900,end.get(Calendar.MONTH),end.get(Calendar.DATE),end.get(Calendar.HOUR),end.get(Calendar.MINUTE),end.get(Calendar.SECOND),0));

चीज़ें दिखाई देती हैं काम करने के लिए क्योंकि अब आप उन तरीकों का उपयोग कर रहे हैं जो मानव पठनीय प्रारूप में/से परिवर्तित होते हैं, और इसलिए निर्दिष्ट समय क्षेत्र जानकारी का उपयोग किया जाता है। हालाँकि, यह केवल वास्तविक समस्या को कवर कर रहा है। असली मुद्दा यह है कि जब आपने इसे endString . से पार्स किया तो समय को गलत तरीके से बदल दिया गया था . यानी वह समय क्षेत्र जो endString . है में व्यक्त किया गया था df1 में निर्धारित समय क्षेत्र से मेल नहीं खाता जिस समय दिनांक को पार्स किया गया था।

संक्षिप्त उत्तर:इस पंक्ति से पहले:

end.setTime(df1.parse(endString));

आपको चाहिए:

  • यह पता लगाएं कि endString में किस समय क्षेत्र का समय है में व्यक्त किया गया था।
  • सेट df1 और नहीं end उसी समय क्षेत्र के लिए। चूंकि df1 वह चीज है जो मानव प्रारूप से तारीख को परिवर्तित कर रही है, यह उस समय क्षेत्र की जानकारी है जिसका उपयोग किया जाता है।

चीयर्स!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL डेटाबेस और टेबल की मरम्मत कैसे करें

  2. एक पेरकोना सर्वर को एक हाइब्रिड क्लाउड पर तैनात करना

  3. कोडनिर्देशक में समूहीकरण WHERE क्लॉज

  4. iOS - कोर डेटा और सर्वर डेटाबेस सिंक्रोनाइज़ेशन सर्वोत्तम अभ्यास

  5. केस संवेदनशील तालिका नामों को कैसे बल दें?