2013-09-06 5 views
9

के लिए शून्य मैं कोड की उन पंक्तियों के साथ एक अजीब समस्या है:दिनांक फ़ॉर्मेटर रिटर्न जून

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"062008"]; 
NSLog(@"Date %@", date); 

परिणाम है:

Date (null) 

लेकिन मैं इस तरह महीने में बदलाव होने पर:

NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MMyyyy"]; 
NSDate * date = [df dateFromString:@"072008"]; 
NSLog(@"Date %@", date); 

परिणाम है:

Date 2008-06-30 23:00:00 +0000 

केवल जून (06) के महीने के लिए, स्ट्रिंग से दिनांक रूपांतरण विफल रहता है!

मुझे लगता है, यह टाइमज़ोन, किसी भी विचार से संबंधित कुछ है।

धन्यवाद

हल:

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 

के रूप में मैंने सोचा, यह समय क्षेत्र से संबंधित है।

+3

अपना खुद का उत्तर लिखें और इसका उत्तर दें - यह आपको अंक प्राप्त करेगा और इसे अनुपालन करने वाले अन्य लोगों के लिए स्पष्ट बनाता है। –

+0

और आपके उत्तर में, आप अधिक विस्तार से समझा सकते हैं: यह समय क्षेत्र से कैसे संबंधित है? ठीक है, जीएमटी को समय क्षेत्र बदलना "तय" है, लेकिन क्या यह वास्तव में * इसे ठीक करता है? क्या समस्या थी? यदि यह वास्तव में एक फिक्स है और न केवल एक पट्टी है, तो यह समस्या को कैसे हल करता है? –

+0

वैसे: किस समय क्षेत्र * आप * में हैं? जब मैं उस कोड को चलाता हूं, और स्पष्ट रूप से जब शब्बीर (उत्तर से) इसे चलाता है, तो हम दोनों को @ @ "062008" 'की तारीख मिलती है। आप नहीं करते हैं, तो समय क्षेत्र और कैलेंडर आपका फॉर्मेटर क्या उपयोग कर रहा है? यदि आपने इसे डिफ़ॉल्ट पर छोड़ा है, तो आपका सिस्टम किस समय क्षेत्र और कैलेंडर पर सेट है? –

उत्तर

1

हल: जैसा कि मैंने सोचा था, यह टाइमज़ोन से संबंधित है।

[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
1

हाँ! आप बिल्कुल सही हैं। मैं भी भी एक ही समस्या का सामना करना पड़ा रहा मेरे विचार के रूप में, यह सुनिश्चित करें कि timezone.Not को यह अपने प्रश्न

NSString *[email protected]"06-2008"; 
NSDateFormatter * df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"MM-yyyy"]; 
[df setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]]; 
NSDate * date = [df dateFromString:strDate]; 
NSLog(@"Date %@", date); 
+0

दिनांकों में लिखे गए प्रारूप को बदलना हमेशा एक विकल्प नहीं है, और एनएसडीएटीफॉर्मेटर को 'शून्य' उस प्रारूप में उस तारीख के लिए। –

11

बधाई के लिए आदर्श समाधान है कि क्या संबंधित है, आप और अधिक समय क्षेत्र विषमताएं पाया गया है! आप सही हैं कि अपना समय क्षेत्र बदलना इस मुद्दे को ठीक करेगा। आइए स्पेलंकिंग करें और देखें कि क्या हम समझ सकते हैं कि क्यों!

सबसे पहले, हम कोशिश करेंगे और जहां इस weirdness होता है हर समय क्षेत्र लगता है:

NSArray *tzs = [NSTimeZone knownTimeZoneNames]; 
NSDateFormatter *f = [[NSDateFormatter alloc] init]; 
f.dateFormat = @"MMyyyy"; 
for (NSString *name in tzs) { 
    f.timeZone = [NSTimeZone timeZoneWithName:name]; 
    NSDate *date = [f dateFromString:@"062008"]; 
    if (date == nil) { 
     NSLog(@"%@", name); 
    } 
} 

यह सभी ज्ञात समय-क्षेत्रों के माध्यम से लूप करने जा रहा है और "062,008" पार्स करने के लिए उस समय क्षेत्र में प्रयास करें। हम इस चलाते हैं, तो हम पाते हैं कि यह लॉग:

Africa/Casablanca 
Asia/Karachi 

तो मेरा अनुमान है कि कि आप या तो कैसाब्लांका या कराची में रहते हैं (क्योंकि डिफ़ॉल्ट रूप से आपका NSDateFormatter साथ अपने समय क्षेत्र, आरंभ नहीं हो जाता यही वजह है कि आप है 'इस समस्या को देख रहे हैं; शायद कैसाब्लांका, यह देखते हुए कि आप जीएमटी से 1 घंटे आगे दिखाई देते हैं)।

देखते हैं कि हम पता लगा सकते हैं कि उन समय क्षेत्रों के साथ अजीब है देखते हैं:

$ zdump -v Africa/Casablanca 
... snip ... 
Africa/Casablanca Sun Jun 1 00:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 WEST isdst=1 
... snip ... 

$ zdump -v Asia/Karachi 
... snip ... 
Asia/Karachi Sat May 31 19:00:00 2008 UTC = Sun Jun 1 01:00:00 2008 PKST isdst=1 
... snip ... 

पर्याप्त बेशक, ऐसा लगता है कि दोनों कैसाब्लांका और कराची 2008 में 1 जून को आधी रात को छोड़ दिया इस प्रकार, आप अनिवार्य रूप से कर रहे हैं इसे एक अयोग्य सक्षम तिथि दे रहा है, और यह nil लौटा रहा है। संक्षेप में।

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

टी एल; डॉ:

डेलाइट सेविंग टाइम समाप्त कर दिया जाना चाहिए।

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