2013-04-24 4 views
15

देता मैं दो दिनांक तार निम्नलिखित हैं: (1) 24/04/2013 और (2) 19/03/2013 मैं कोशिश कर रहा हूँ इस्लामी (उम Al Qura) दिनांक में इन तारीखों कनवर्ट करते हैं, मैं इस कोड ब्लॉक का उपयोग कर रहा ऐसा करने के लिए:इस्लामी तारीख करने के लिए एक ग्रेगोरी तिथि स्ट्रिंग परिवर्तित सही और गलत परिणाम

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
    df.dateFormat = @"dd/MM/yyyy"; 
    df.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
    NSDate *dateInGrogrian = [df dateFromString:@"24/04/2013"]; 

    NSDateFormatter *df2 = [[NSDateFormatter alloc] init]; 
    NSCalendar * cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCalendar]; 
    [df2 setCalendar:cal]; 
    [df2 setDateFormat:@"dd/MM/yyyy"]; 
    NSLog(@"Converted date to Islamic = %@",[df2 stringFromDate:dateInGrogrian]); 

यदि इनपुट स्ट्रिंग 24/04/2013 NSLog दिखाया गया था:

Converted date to Islamic = 14/06/1434 जो सही है (the formal Islamic calendar के अनुसार जो सभी इस्लामी काउंटी में उपयोग किया जाता है रों)। लेकिन अगर इनपुट स्ट्रिंग 19/03/2013 NSLog दिखाया गया था:

Converted date to Islamic = 08/05/1434 जो (इस्लामी कैलेंडर सही दिनांक 1434/07/05 जो 1 दिन पीछे होना चाहिए के अनुसार) गलत है।

- नोट्स विचार करने के लिए एक जवाब का सुझाव से पहले:

(1) मैं NSIslamicCalendar के बजाय कैलेंडर पहचानकर्ता NSIslamicCivilCalendar उपयोग करने के लिए कोशिश की है, लेकिन कोई लाभ नहीं हुआ: परिवर्तित दिनांक से एक सही था और दूसरा गलत था (1 दिन पीछे)।

(2) मैं इस तरह GMT समय क्षेत्र का उपयोग करने की कोशिश की है: [df2 setTimeZone : [NSTimeZone timeZoneWithName:@"GMT"]];, इस दिन के लिए एक सही परिवर्तित तारीख (2) लेकिन दिन के लिए गलत (1) (1 दिन के पीछे) का उत्पादन किया।

(3) मैं समाधान के संयोजन की कोशिश की है: GMT समय क्षेत्र के बिना साथ/NSIslamicCivilCalendar, NSIslamicCalendar साथ/GMT समय क्षेत्र के बिना, लेकिन यह भी कोई लाभ नहीं हुआ ...

किसी को भी एक कोड ब्लॉक प्रदान कर सकते हैं जो दोनों तिथियों को संतुष्ट करता है? इसलिए मैं सुनिश्चित करता हूं कि किसी भी प्रदत्त ग्रेगोरियन दिनांक स्ट्रिंग को इस्लामी दिनांक स्ट्रिंग में सही ढंग से परिवर्तित किया गया हो।

आपको बहुत बहुत धन्यवाद।

+3

मुझे लगता है कि उस स्थान विशेष और डेलाइट सेविंग की वजह से है ... मैं से एक जवाब में पढ़ा [इस दिनांक समय विशेषज्ञ] (http://stackoverflow.com/users/106435/vikingosegundo) पढ़ें इस [इस्लामी कैलेंडर त्रुटि] (http: // stackoverflow।कॉम/प्रश्न/1425 9 3 9 7/nscalendar-date-error/14264680 # 14264680) यह आपकी मदद कर सकता है –

+0

@AnopVaidya आपके द्वारा प्रदान किया गया लिंक समस्या का समाधान नहीं करता है, यह सिर्फ इस्लामी कैलेंडर कैसे काम करता है, इस बारे में सामान्य जानकारी देता है उत्तर में प्रदान किए गए कोड नमूने का प्रयास किया लेकिन इससे कोई फर्क नहीं पड़ता। – JAHelia

+0

हालांकि यह इस विसंगति के कारण का उत्तर नहीं दे सकता है, यह कुछ प्रकाश बहाल करने में मदद कर सकता है: यदि आप 10/04/2013 को परिवर्तित करते हैं, तो आपको 30/05/1434 मिलते हैं। मुझे इस्लामी कैलेंडर के बारे में कुछ भी पता नहीं है, लेकिन विकिपीडिया/ऑनलाइन कनवर्टर्स से मेरी समझ यह है कि यह 5 वां महीना इस साल केवल 2 9 दिन है, इसलिए यह विसंगति का संकेत हो सकता है। – Nobosi

उत्तर

18

पिछले 4 वर्षों से सभी तिथियों को प्रिंट करने के बाद ऐसा लगता है कि ऐप्पल इस्लामिक कैलेंडर की गणितीय गणना के लिए कुछ हद तक स्वीकार्य सूत्र का उपयोग करता है, क्योंकि मोक्सी ने बताया कि वास्तविक कैलेंडर वैज्ञानिक दिनों पर आधारित नहीं है बल्कि इसके बजाय चंद्र सन्निकटन।

यह सूत्र यह है कि सभी विषम महीनों के महीनों में 30 दिन हैं और सभी महीनों के महीनों में पिछले दिन किसी भी वर्ष में अतिरिक्त दिन जोड़ा गया है जिसमें संख्या वर्ष 30 30 निम्न में से एक है: 2, 5, 7, 10, 13, 26, या 2 9।

परिणाम औसत औसत लंबाई 29.53056 दिन है, जो 2 9 .530 9 5 दिनों के चंद्र महीने के करीब है।

इस सूत्र का उपयोग कंप्यूटर में कहीं और किया गया है, क्योंकि इतिहास में हर साल लुकअप टेबल का उपयोग किये बिना तारीख की गणना करने का यह एकमात्र तरीका है। जैसे कि जब तक आप लुकअप टेबल स्वयं नहीं लिखते, यह उतना सटीक होगा जितना आप पिछली और आगे की सभी तिथियों के लिए प्राप्त कर सकते हैं।

+0

+1 बहुत अच्छा जवाब :) – Anupdas

+0

स्पष्टीकरण के लिए धन्यवाद, लेकिन इस्लामिक तिथि की गणना करने के लिए कंप्यूटरों में उपयोग की जाने वाली एकमात्र विधि नहीं है, जैसा कि मैंने प्रश्न में उल्लेख किया है, वास्तविक उम अल कुरा (इस्लामिक) से अलग-अलग गणना की गई तिथियां हैं। कैलेंडर। मैं अभी भी इस बिंदु पर अटक गया हूँ। – JAHelia

+0

याद रखें इस्लामी कैलेंडर वास्तविक चंद्रमाओं पर आधारित है। यह मुझे लगता है कि विसंगति कहाँ है। गणितीय गणना के परिणामस्वरूप आप परिणाम प्राप्त कर सकते हैं, लेकिन जहां वे कुछ विसंगति हैं। – logixologist

7
// Create a Gregorian Calendar 
NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

// Set up components of a Gregorian date 
NSDateComponents *gregorianComponents = [[NSCalendar currentCalendar] components:NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit fromDate:[NSDate date]]; 

NSLog(@"[In Gregorian calendar ->] Day: %ld, Month: %ld, Year:%ld", 
     (long)[gregorianComponents day], 
     (long)[gregorianComponents month], 
     (long)[gregorianComponents year]); 


gregorianComponents.day = [gregorianComponents day]; 
gregorianComponents.month = [gregorianComponents month]; 
gregorianComponents.year = [gregorianComponents year]; 

// Create the date 
NSDate *date = [gregorianCalendar dateFromComponents:gregorianComponents]; 



// Then create an Islamic calendar 
NSCalendar *hijriCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSIslamicCivilCalendar]; 

// And grab those date components for the same date 
NSDateComponents *hijriComponents = [hijriCalendar components:(NSDayCalendarUnit | 
                   NSMonthCalendarUnit | 
                   NSYearCalendarUnit) 
                fromDate:date]; 


NSLog(@"[In Hijri calendar ->] Day: %ld, Month: %ld, Year:%ld", 
     (long)[hijriComponents day], 
     (long)[hijriComponents month], 
     (long)[hijriComponents year]); 
+0

+1 पूरी तरह से काम किया, मैंने देखा कि कैलेंडर एक दिन पीछे है, क्या यह "उम अल कुरा" कैलेंडर या अन्य का उपयोग करता है ?? – Aziz

+0

Europa/istanbul के लिए काम नहीं कर रहा है। मैंने एनएसआईस्लैमिक कैलेंडर और एनएसआईस्लैमिक CivilCalendar दोनों की कोशिश की। जब सफल नहीं होता, मैंने कैलेंडरग्रेगर.टाइज़ोन = [एनएसटाइमज़ोन सिटेमटाइमज़ोन] और कैलेंडर हिजरी.टाइज़ोन = [एनएसटाइमज़ोन सिटेमटाइमज़ोन] जोड़ा। अभी भी काम नहीं कर रहा है – Add080bbA

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