2012-01-31 15 views
6

आईओएस 5 सिम्युलेटर और डिवाइस पर, NSDateFormatter "एशिया/कोलकाता "ज़ेड" या "ज़ज़" विनिर्देशक के लिए।NSDateFormatter "z" या "zzz" विनिर्देशक के लिए "एशिया/कोलकाता" के लिए समय क्षेत्र संक्षेप नहीं दिखाता है, केवल जीएमटी ऑफसेट

NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Kolkata"]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
dateFormatter.dateFormat = @"z"; // or @"zzz" 
dateFormatter.timeZone = timeZone; 

NSLog(@"date string: %@", [dateFormatter stringFromDate:[NSDate date]]); // "GMT+05:30", expected "IST" 
NSLog(@"time zone abbreviation: %@", [timeZone abbreviationForDate:[NSDate date]]); // "IST" 

मैं उत्पादन के लिए ऊपर दिए गए कोड की उम्मीद:

IST 
IST 

लेकिन यह आउटपुट:

GMT+05:30 
IST 

संपादित

एक भारतीय के स्थान के लिए स्थानीय सेटिंग नहीं है मदद करने लगते हैं।

NSLocale *indianEnglishLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_IN"] autorelease]; 
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Kolkata"]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setLocale:indianEnglishLocale]; 
[dateFormatter setDateFormat:@"z"]; // or @"zzz" 
[dateFormatter setTimeZone:timeZone]; 

NSLog(@"date string: %@", [dateFormatter stringFromDate:[NSDate date]]); // "GMT+05:30", expected "IST" 
NSLog(@"time zone abbreviation: %@", [timeZone abbreviationForDate:[NSDate date]]); // "IST" 

मैं उत्पादन के लिए ऊपर दिए गए कोड की उम्मीद:

IST 
IST 

लेकिन यह आउटपुट:

GMT+05:30 
IST 

यह एक बग है? क्या मुझसे कुछ गलत हो रही है? People have mentioned that NSDateFormatter has bugs, especially when a time zone is specified in the format string. Could this be one of those bugs?

+0

ध्यान दें कि आधुनिक आईओएस में एक ही तरीका है एप्पल द्वारा की सिफारिश की एक तारीख उपयोग करने के लिए फॉर्मेटर है: https://stackoverflow.com/a/42370648/294884 – Fattie

उत्तर

13

से http://www.cocoabuilder.com/archive/cocoa/310977-nsdateformatter-not-working-on-ios-5.html#311281

आईओएस 5.0 में संक्षिप्त समय क्षेत्र नामों में से पार्स में परिवर्तन खुला स्रोत आईसीयू 4.8 पुस्तकालय (और खुला स्रोत CLDR 2.0 में एक जानबूझकर परिवर्तन का एक परिणाम है डेटा जो इसका उपयोग करता है), एक संशोधित संस्करण जिसका उपयोग NSDateFormatter कार्यक्षमता में से कुछ को लागू करने के लिए किया जाता है।

मुद्दा यह है: के रूप में जेड (= zzz) या वी (= vvv) द्वारा निर्दिष्ट कम समय क्षेत्र प्रारूपों के साथ, वहाँ अस्पष्टता का एक बहुत हो सकता है। उदाहरण के लिए, "ईटी" पूर्वी समय के लिए "कई विभिन्न क्षेत्रों में अलग-अलग समय क्षेत्रों पर लागू हो सकता है। स्वरूपण और पार्सिंग विश्वसनीयता में सुधार करने के लिए, लघु रूपों का उपयोग केवल लोकल में किया जाता है यदि" cu "(आमतौर पर उपयोग किया गया) ध्वज ( दोनों स्वरूपण और पार्स के लिए) स्थान के लिए निर्धारित है। अन्यथा, केवल लंबे रूपों किया जाता है।

"एन" स्थान के लिए (= "hi पर"), घन झंडा ऐसे metazones के लिए निर्धारित है अलास्का, अमेरिका_Central, America_Eterntern, America_Mountain, अमेरिका_Pacific, अटलांटिक, Hawaii_Aleutian, और जीएमटी। यह यूरोप_Central के लिए सेट

हालांकि, "en_GB" लोकेल के लिए, सीयू ध्वज यूरोप_Central के लिए सेट है।

तो एक फ़ॉर्मेटर कम समय क्षेत्र शैली "Z" या "zzz" और स्थान "एन" या "en_US" "CEST" को पार्स नहीं होगा या "सीईटी", के लिए लेकिन अगर लोकेल बजाय सेट किया गया है करने के लिए सेट " en_GB "यह उनको पार्स करेगा। "जीएमटी" शैली सभी द्वारा पार्स की जाएगी।

फ़ॉर्मेटर लंबे समय क्षेत्र शैली "ZZZZ" के लिए सेट कर दिया जाता है, और स्थान "एन", "hi पर", या "en_GB", निम्न में से कोई के किसी भी पार्स किया जाएगा है तो, तो इसलिए कि वे स्पष्ट नहीं हैं: "प्रशांत डेलाइट टाइम" "मध्य यूरोपीय ग्रीष्मकालीन समय" "मध्य यूरोपीय समय"

उम्मीद है कि इससे मदद मिलती है।

  • पीटर एडबर्ग

http://www.cocoabuilder.com/archive/cocoa/313301-nsdateformatter-not-working-on-ios-5.html#313301

हीथ, हाँ, आप कर रहे हैं सही है, उदाहरण के लिए आप ऊपर दी गई, से [dateFormatter stringFromDate: [NSDate तारीख]] संक्षिप्त समय क्षेत्र का नाम "आईएसटी" का उपयोग करना चाहिए। तथ्य यह है कि यह में में वर्तमान ओएसएक्स और आईओएस रिलीज (CLDR 1.9.1 और 2.0) में आईसीयू द्वारा उपयोग किए गए CLDR डेटा के संस्करणों में "en_IN" लोकेल डेटा में कमी के कारण नहीं है। उन सीएलडीआर संस्करणों में "en_IN" लोकेल ओवरराइड नहीं किया गया था या बेस "एन" लोकेल, से किसी भी टाइमज़ोन नाम डेटा को पूरक करता है जिसका डिफ़ॉल्ट सामग्री "en_US" के लिए है।

यह कुछ दिनों में सीएलडीआर 21 रिलीज के लिए पहले ही तय हो चुका है। इसे आईसीयू 49 में शामिल किया जा रहा है जिसे भविष्य में ओएसएक्स और आईओएस रिलीज में उठाया जाएगा।

  • पीटर ई

--- संपादित करें ---

formats और उनके rules पर यूनिकोड प्रलेखन के अनुसार, V प्रारूप एक बेहतर विकल्प हो सकता है:

... वही एफ जेड के रूप में ऑरमेट, सिवाय इसके कि मेटाज़ोन टाइमज़ोन संक्षेप को उपलब्ध होने पर प्रदर्शित किया जाना चाहिए, [सामान्य] [ध्वज] के मूल्य के बावजूद।

मेरे मामले में, निम्न कोड के लिए:

NSLocale *indianEnglishLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_IN"] autorelease]; 
NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"Asia/Kolkata"]; 
NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
[dateFormatter setLocale:indianEnglishLocale]; 
[dateFormatter setDateFormat:@"V"]; 
[dateFormatter setTimeZone:timeZone]; 

NSLog(@"V date string: %@", [dateFormatter stringFromDate:[NSDate date]]); 

मैं निम्नलिखित उत्पादन प्राप्त करते हैं:

V date string: IST 
+2

मुझे प्राप्त हुआ - इसके लिए आईएसटी के बजाय इंकू! – Smitha

+0

स्मिथ के रूप में एक ही मुद्दा ... आईएसटी – Punita

+1

के बजाय प्रिंट इंकू की तारीख मैंने नीचे की कोशिश की Formatting स्ट्रिंग ** [dateFormatter setDateFormat: @ "z"]; ** और यह पूरी तरह से काम करता है। – Punita

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