2010-11-23 19 views
22

यहाँ मेरी कोड है:NSDateFormatter dateFromString रिटर्न शून्य

NSString *_date = @"Tue, 23 Nov 2010 16:14:14 +0000"; 
NSDateFormatter *parser = [[NSDateFormatter alloc] init]; 
[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss '+0000'"]; 
[parser setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]]; 
NSDate *date = [parser dateFromString:_date]; 

यह नहीं चलता है: 'तारीख' 'शून्य' पर सेट है। मैं

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss ZZZ"]; 
कोई और अधिक सफलता के साथ

साथ करने की कोशिश की ...

आप किसी भी विचार है?

अग्रिम

+1

आपका डिवाइस/सिम्युलेटर क्या लोकेल सेट है? यह केवल तभी काम करेगा जब लोकेल अंग्रेजी पर सेट हो। –

+0

मेरा लोकेल फ्रेंच है ... मैंने इसके बारे में सोचा नहीं, मुझ पर शर्म की बात है :) क्या इस कोड को शुरुआती तारीख को बदले बिना अधिकांश मौजूदा लोकेशंस के साथ संगत बनाने का कोई तरीका है? – Harkonnen

+1

आप पार्सिंग (उदाहरण के लिए en_US_POSIX) के लिए एक विशिष्ट लोकेल का उपयोग करने के लिए NSDateFormatter को बता सकते हैं। [ऐप्पल क्यूए 1480] देखें (http://developer.apple.com/library/ios/#qa/qa2010/qa1480.html)। – Anna

उत्तर

53

इस लाइन जोड़ें:

NSDateFormatter *parser = [[NSDateFormatter alloc] init]; 
[parser setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]]; 

और यह काम करेंगे। डिफ़ॉल्ट रूप से, NSDateFormatter सिस्टम के वर्तमान लोकेल का उपयोग करता है, जो वर्तमान उपयोगकर्ता की प्राथमिकताओं के आधार पर भिन्न हो सकता है। ऊपर की तारीख स्ट्रिंग (@"Tue, 23 Nov 2010 16:14:14 +0000") में अंग्रेजी शब्द ("ट्यू", "सेप") शामिल हैं जो संभावित रूप से डेट फॉर्मेटर द्वारा पहचाना नहीं जाएगा यदि लोकेल अंग्रेजी के अलावा किसी अन्य चीज़ पर सेट किया जाएगा।

इसके अलावा, गैर-पश्चिमी संस्कृतियों के उपयोगकर्ता स्थानीय लोगों का उपयोग कर सकते हैं जो पश्चिमी दुनिया में उपयोग किए जाने वाले ग्रेगोरियन कैलेंडर की तुलना में एक अलग कैलेंडर का उपयोग कर सकते हैं। यदि आपने लोकेल को स्पष्ट रूप से सेट नहीं किया है, तो डेट फॉर्मेटर तिथि को पार्स करने में सक्षम हो सकता है लेकिन परिणामी NSDate समय पर एक पूरे बिंदु का प्रतिनिधित्व करेगा।

लोकेल पहचानकर्ता @"en_US_POSIX" इस उद्देश्य के लिए है। यह बदलने की गारंटी है भले ही @ "en_US" लोकेल किसी दिन अपनी डिफ़ॉल्ट सेटिंग्स को बदल दे।

+0

बहुत बहुत धन्यवाद। यह ठीक है – Harkonnen

+0

यह बहुत अच्छा होगा अगर आप समझा सकते हैं कि लोकेल को समस्या क्यों हल करती है। दूसरे शब्दों में, 'dateFromString' केवल तभी काम करेगा जब लोकेल यूएस अंग्रेज़ी पर सेट हो? – Andrew

+1

@andrewap: मैंने एक स्पष्टीकरण के साथ अपना जवाब अपडेट किया (और मैंने अपनी सिफारिश को '@" en_US "' से '@" en_US_POSIX "' में बदल दिया, जो भविष्य में सबूत समाधान है। –

3

समय क्षेत्र विनिर्देशक 'z' है धन्यवाद, तो अपने स्ट्रिंग होना चाहिए:

[parser setDateFormat:@"EEE, dd MMM yyyy HH:mm:ss z"]; 
+0

ज़ेड का उपयोग करना वास्तव में यहां सबसे सरल और साफ समाधान है Iho। – Max

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