आप वर्तमान में जो करने का प्रयास कर रहे हैं उसमें दो समस्याएं हैं:
- आपके पास कोड की दूसरी पंक्ति में एक टाइपो है जिसका अर्थ है कि आपके महीनों को मिनटों के रूप में पार्स किया जा रहा है
- जैसा कि बताया गया है, आप समय क्षेत्र को ध्यान में नहीं रख रहे हैं।
पहली समस्या का समाधान करने के लिए, आपको बदलना होगा
Date d2 = new SimpleDateFormat("dd/mm/yyyy").parse(arr[10]);
करने के लिए
Date d2 = new SimpleDateFormat("dd/MM/yyyy").parse(arr[10]);
दिनांक प्रारूप केस संवेदी होते हैं, आप जो करने का प्रयास कर रहे थे वह महीने को **M** के बजाय **m**इन्यूट के रूप में पार्स करना है। मैंने जो परीक्षण चलाया, उसका मतलब था कि सभी महीने जनवरी के रूप में निकल रहे थे, जो मैं देख सकता हूं कि आपके उदाहरण में भी हो रहा था। साथ ही, मैंने देखा है कि आपके कोड की पहली पंक्ति, फ़ॉर्मेटर (जो सही ढंग से सेट अप है) का उपयोग नहीं किया गया है।
दूसरी समस्या यह है कि हाँ, Java Date
जैसा आप उम्मीद करते हैं वैसा व्यवहार न करें। उनके पास एक समय घटक होना चाहिए, भले ही आप इसके बारे में केवल तारीख की परवाह न करें। इसके अलावा, उनके पास एक समय क्षेत्र होना चाहिए क्योंकि उनके पास समय है।
हो सकता है कि आपके पास बेहतर जोडा लाइब्रेरी में जाने का विकल्प न हो, इस मामले में इसके आसपास काम करने के तरीके हैं। मैंने एक परीक्षण लिखा है जो इसे प्रदर्शित करना चाहिए:
@Test
public void shouldParseDateCorrectly() throws Exception {
// Given
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
// When
Date parsedDate = format.parse("21/08/2012");
// Then
Assert.assertThat(parsedDate.toString(), is("Tue Aug 21 02:00:00 CEST 2012"));
Assert.assertThat(parsedDate.toGMTString(), is("21 Aug 2012 00:00:00 GMT"));
}
तो आप देख सकते हैं कि मैंने सही प्रारूप का उपयोग किया है, लेकिन इसके टाइमज़ोन को यूटीसी पर भी सेट किया है (इसलिए इसमें शून्य की ऑफसेट है और कोई डेलाइट बचत नहीं है)। फिर जब आप इस फॉर्मेटर के साथ तारीख को पार्स करते हैं, तो तारीख यूटीसी टाइमज़ोन में मध्यरात्रि के समय के साथ आ जाएगी। क्योंकि मेरा कंप्यूटर यूरोप में है, जब मैं इस तिथि को प्रिंट करता हूं तो यह 2 बजे का समय दिखाता है, क्योंकि यह समय क्षेत्र यूटीसी से 2 घंटे आगे है। लेकिन जब मैं पदावनत toGMTString
. का उपयोग करता हूं विधि, समय शून्य के रूप में निकलता है।
जब आप जावा ड्राइवर का उपयोग करके इस तिथि को मोंगोडीबी में संग्रहीत करते हैं, तो यह इसके साथ दिनांक, समय और समय क्षेत्र को बचाएगा, भले ही आपको केवल तारीख की परवाह हो। जब आप तारीखों को दोबारा पढ़ेंगे तो आपको क्या करना होगा यह याद रखना है कि वे यूटीसी में हैं और उचित समय क्षेत्र सेट करें।
वैकल्पिक रूप से, आप उन्हें समयक्षेत्र बदले बिना MongoDB में संग्रहीत कर सकते हैं, बशर्ते आप उन्हें हमेशा उसी समयक्षेत्र में पढ़ेंगे और लिखेंगे। लेकिन यह अप्रत्याशित बग से भरा होता है जब a) आधी रात से अधिक समय से निपटना और b) डेलाइट सेविंग टाइम शुरू हो जाता है (या रुक जाता है)।
या केवल जोडा-टाइम का उपयोग करें ।