पृष्ठभूमि:एक आश्चर्यजनक रूप से सामान्य - और बड़ी - यहां तक कि शानदार प्रोग्रामर द्वारा साझा की गई गलत धारणा यह है कि समय टिकटों को संग्रहीत किया जाता है (आपके डेटाबेस, दिनांक, कैलेंडर, टाइमस्टैम्प, एट अल में) किसी भी तरह से समय क्षेत्र की जानकारी होती है। वे नहीं करते हैं। 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
वह चीज है जो मानव प्रारूप से तारीख को परिवर्तित कर रही है, यह उस समय क्षेत्र की जानकारी है जिसका उपयोग किया जाता है।
चीयर्स!