2012-06-05 10 views
9

के बाद कोड समस्या से पता चलता विफल रहता है?साल घटक जोड़ना

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 


NSCalendar *islamic = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; 
NSDate *date = [islamic dateFromComponents:components]; 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setCalendar:islamic]; 
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 

NSLog(@"%@", [dateFormatter stringFromDate:date]); // -> 01.01.1435 

NSDateComponents *offsetComponents = [[NSDateComponents alloc] init]; 
[offsetComponents setYear:1]; 

NSDate *dateWithOffset = [islamic dateByAddingComponents:offsetComponents toDate:date options:0]; 

NSLog(@"%@", [dateFormatter stringFromDate:dateWithOffset]); 
// -> 30.12.1435 ... WHY NOT 01.01.1436 ???? 
+0

कोई समाधान नहीं है लेकिन समस्या को कम करने में मदद कर सकता है: क्या आपने ग्रेगोरियन जैसे किसी भिन्न प्रकार का उपयोग करके अपना प्रारंभिक कैलेंडर बनाने का प्रयास किया है? इसे आज़माएं और देखें कि क्या समस्या अभी भी इस्लामी घटक को रद्द करने या संकीर्ण करने के लिए होती है, संभवतः कुछ क्विर्क होने का कारण बनता है। – Dima

+0

अन्य कैलेंडर (ग्रेगोरियन, हेब्रू, बौद्ध) के साथ एल्गोरिदम ठीक काम करता प्रतीत होता है - कम से कम उस समय अंतराल के लिए मैंने देखा। यहां तक ​​कि अधिकांश इस्लामिक वर्षों के लिए यह काम करता है, लेकिन कुछ नहीं करते हैं। –

+0

मैंने एक नई परियोजना बनाई और इसमें अपना कोड कॉपी किया। आईओएस 4.3, 5.0, और 5.1 के तहत मुझे अपेक्षित परिणाम मिला। 'मुह। 1, 1435' और 'मुह। 1, 1436' –

उत्तर

3

मेरा संदेह गर्मियों/शीतकालीन (डेलाइट बचत समय) अंतर के कारण है। Muh। 1, 1435 5 नवंबर 2013 को गिरता है, जबकि मुह। 1, 1436 25 अक्टूबर, 2014 को पड़ता है। पहली तारीख शीतकालीन समय के दौरान होती है, दूसरा गर्मियों के दौरान होता है।

आपके द्वारा बनाए गए पहले एनएसडीएट 5 नवंबर 2013 00:00 (आधी रात को) है। "dateByAddingComponents:" घटकों को सेकंड में कनवर्ट करके काम करता है, और इसे पहली तारीख में जोड़ता है। इस मामले में, परिणाम गर्मियों की वजह से 24 अक्टूबर, 2014 23:00 है।

इसका यह भी अर्थ होगा कि समय के बीच डेलाइट सेविंग टाइम अंतर के कारण परिणाम दुनिया भर के विभिन्न लोगों के लिए भिन्न हो सकते हैं।

आप आधी रात (जो सामान्य एक अच्छा विचार में है जब शुद्ध तिथियों के साथ काम कर रहे) के बजाय, मध्यान्ह करने के लिए पहली तारीख सेट करके समस्या को रोका जा सकता है:

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:1]; 
[components setMonth:1]; 
[components setYear:1435]; 
[components setHour:12]; 

अब, कि क्या यह सही है "dateByAddingComponents" का व्यवहार एक और सवाल है।

+0

अच्छा तर्क :-) मैं समय-समय पर पहलू की जांच करना चाहता हूं और इसके बारे में प्रतिक्रिया प्रदान करना चाहता हूं। अभी मैं जल्दी में हूं - इसलिए मुझे थोड़ा धैर्य मांगना है। –

+0

आपका संदेह सही था: स्पष्ट रूप से कैलेंडर के लिए समय ज़ोन (एक गैर डेलाइट सेविंग टाइम वैल्यू पर) सेट करना, डेटफॉर्मेटर और एनएसडेट कॉम्पोनेंट्स अपेक्षित मानों में परिणाम :-) –

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