2010-10-28 14 views
5

मुझे समझ में नहीं आता कि क्यों MutableDateTime.setDate() "कल" ​​को समय निर्धारित कर रहा है (लॉग टाइमस्टैम्प घंटे देखें - यह 20:28 है)। क्या यह टाइमज़ोन संबंधित है? क्या मुझे फॉर्मेटर पर कुछ सेट करने की ज़रूरत है?जोडा समय MutableDateTime के उदाहरण से 24 घंटों घटा रहा है, मैं जानना चाहता हूं कि

मुझे उम्मीद है कि "10/27/2010" के साथ सेटडेट को कॉल करने के बाद, दिनांक 20:28 ईडीटी 10/26/के बजाय पार्स की तारीख 00:00 ईडीटी 10/27/10 जैसा ही होगा, 10। यह 24 घंटे पहले "अब" से है।

मुझे यहां क्या याद आ रही है, या वांछित परिणाम प्राप्त करने के लिए मुझे कोड को कैसे संपादित करना चाहिए? मैं जोदा समय के लिए नया हूं, और इस रहस्य को हल करना चाहता हूं।

DateTimeFormatter dateFormatterJ = DateTimeFormat.forPattern("MM/dd/yyyy"); 
DateTimeFormatter timestampFormatJ = DateTimeFormat.forPattern("HH:mm zzz MM/dd/yy"); 

MutableDateTime startDate = new MutableDateTime(); 

log.info("parsed date " + 
    timestampFormatJ.print(dateFormatterJ.parseMutableDateTime(startDateString))); 

startDate.setDate((dateFormatterJ.parseMutableDateTime(startDateString))); 

log.info("startDate: " + timestampFormatJ.print(startDate)); 

इस मामले में, startDateString बस है "2010/10/27"। ,

10-27 20:28:55 INFO parsed date: 00:00 EDT 10/27/10 
10-27 20:28:55 INFO startDate: 20:28 EDT 10/26/10 

धन्यवाद

उत्तर

2

जब एक स्ट्रिंग है कि एक GMT ऑफसेट या समय-क्षेत्र की आईडी शामिल नहीं है पार्स करने है, तो आप चाहिए ऐसा तीन चीजों में से एक:

  • कुछ भी नहीं है, और स्वीकार करते हैं कि स्ट्रिंग सामान्य समय क्षेत्र
  • में पार्स किया गया है फ़ॉर्मेटर
  • उपयोग parseLocalDate() Instea पर withZone() का उपयोग करने में पार्स करने के लिए समय क्षेत्र दर्शा के रूप में इसे सही ढंग से डेटा वास्तव में था कि इनपुट, जो समय के बिना एक तारीख थी, ऑफसेट या क्षेत्र को पार्स करता parseMutableDateTime()

पिछले d, पसंदीदा समाधान है।

परीक्षण कोड में parseLocalDate() का उपयोग सही ढंग से तिथि को पार करता है।

+1

+ "parseLocalDate" + joda के लिए एक google जून से एक ही Google समूह पोस्ट देता है और जीडब्ल्यूटी में कुछ कोड। मैंने स्रोत को देखने से पहले ज़ोन() के साथ इसका उपयोग करने का प्रयास किया और नतीजा वही है। ऐसा लगता है कि मैं एक जोन निर्दिष्ट करता हूं, भले ही MutableDateTime में कोड इसे मेरे क्रोनोलॉजी पर देखता है, फिर इसे म्यूटेबलडेट टाइम के टाइमज़ोन में स्थानांतरित करने के बजाय इसे यूटीसी में बदल देता है। – Affe

4

सरल जवाब होगा क्योंकि जावाडोक तो कहते हैं:

यहां लॉग उत्पादन होता है।

सार्वजनिक शून्य setDate (ReadableInstant तत्काल)

एक और तत्काल से तिथि निर्धारित करें। इस ऑब्जेक्ट का समय भाग अप्रभावित होगा।

पैरामीटर: तत्काल - से तारीख कॉपी करने के लिए एक पल, समय भाग पर ध्यान नहीं दिया

फेंकता: IllegalArgumentException - अगर वस्तु invalidobject अमान्य

है Joda कहते हैं जब 'तिथि है 'इसका मतलब शब्द शब्द का मानव अर्थ है। "इस मूल्य का वर्ष-महीना हिस्सा", java.util.Date के तार्किक समकक्ष नहीं है। (Joda के पूरे मुद्दे की तारीख और समय से निपटने के लिए कुछ प्राकृतिक, समझदार, अर्थ विज्ञान लागू करने के लिए किया जा रहा है।)

संपादित करें: अपने 'ठीक करने के लिए' सवाल का जवाब के लिए, बस कार्य करें:

MutableDateTime startDate = new MutableDateTime(dateFormatterJ.parseMutableDateTime(startDateString)); 

या अन्यथा पाठ्यक्रम के समय भाग मैन्युअल रूप से शून्य।

संपादित 2: हम्म, मैंने जाहिर तौर पर पर्याप्त ध्यान से नहीं पढ़ा, यह केवल जवाब का आधा है। जांच करूंगा।

संपादित करें 3: अच्छी तरह से यह मुझे इतना खराब कर दिया कि मैंने इसे देखने के लिए एक मिनट लिया।

public void setDate(final ReadableInstant instant) { 
    long instantMillis = DateTimeUtils.getInstantMillis(instant); 
    Chronology instantChrono = DateTimeUtils.getInstantChronology(instant); 
    DateTimeZone zone = instantChrono.getZone(); 
    if (zone != null) { 
     instantMillis = zone.getMillisKeepLocal(**DateTimeZone.UTC**, instantMillis); 
    } 
    setDate(instantMillis); 
} 

किसी कारण से, यह तिथि निर्धारित करने से पहले आपके पूर्ण समय को यूटीसी में आगे बढ़ा रहा है। तो आप इसे 10/27/2010 00:00 ईडीटी देते हैं और यह 10/27/2010 00:00 यूटीसी का प्रतिनिधित्व करने वाले मिलीसेकंड की संख्या के लिए पूर्ण परिमाण निर्धारित करता है, जो निश्चित रूप से दिन पहले केवल 6 या 7 बजे है । फिर यह ईडीटी दिनांक मूल्य 10/26 होने के लिए पाता है।कि अगर किसी भी तरह का इरादा है

कहना नहीं किया जा सका या अगर यह एक बग है कि 2 साल या क्या के लिए हुई है।)

+0

धन्यवाद, अफफ़। SetDate() का उपयोग करने के बजाय पार्स किए गए दिनांक स्ट्रिंग के साथ MutableDateTime को नया करने का आपका फ़िक्स काम करता है। मूल कारण में स्पष्टीकरण भी बहुत सराहना की है। मैं इसे एक बग के रूप में समझूंगा, लेकिन अलग-अलग राय हो सकती हैं। –

+0

मैंने इस मुद्दे के लिए टिकट बनाया है - https://sourceforge.net/tracker/?func=detail&aid=3097754&group_id=97367&atid=617889 –

संबंधित मुद्दे