2012-11-30 8 views
5

मैं एक तारीख स्ट्रिंग एक सर्वर से प्राप्त बदलने की आवश्यकता है, स्थानीय NSDate करने के लिए, स्ट्रिंग लगता है:NSDateFormatter: 'जीएमटी' के साथ दिनांक एनएसडीएटी में दिनांक स्ट्रिंग को कैसे परिवर्तित करें?

"Fri, 30 Nov 2012 00:35:18 GMT" 

लेकिन अब आज शुक्रवार, 30 वीं नवंबर, 11:36 AM है, तो मैं कैसे परिवर्तित एक सार्थक स्थानीय NSDate के लिए स्ट्रिंग?

मैंने पाया:

iPhone: NSDate convert GMT to local time

लेकिन जैसे कि यह विपरीत है लग रहा है।

उत्तर

13

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

NSString *dateString   = @"Fri, 30 Nov 2012 00:35:18 GMT"; 

NSDateFormatter *dateFormatter = [NSDateFormatter new]; 
dateFormatter.dateFormat  = @"EEE, dd MM yyyy HH:mm:ss zzz"; 

NSDate *date     = [dateFormatter dateFromString:dateString]; 
NSString *localDateString  = [dateFormatter stringFromDate:date]; 

NSLog(@"%@", localDateString); 
// Results: Thu, 29 11 2012 19:35:18 EST 
+0

ओह; मेरे जवाब में गलत zeds था। +1। यद्यपि आपको अभी भी लोकेल को स्पष्ट रूप से सेट करना चाहिए - अन्यथा 'NSDateFormatter' को आपकी सटीक स्वरूपण स्ट्रिंग को संशोधित करने का अधिकार सुरक्षित है। – Tommy

+0

@ टॉमी: अगर मुझे गलत नहीं लगता है, तो लोकेल आपके वर्तमान लोकेल में चूक जाता है। मैं सिर्फ NSLog'd dateFormatter.locale.localeIdentifier (यह स्थापित करने के बिना) और यह मेरे "en_US" है, जो मेरे वर्तमान स्थान है दे दी है। यही कारण है कि मैंने इसे सेट नहीं किया, क्योंकि वह इसे अपने स्थानीय टाइमज़ोन में चाहता था। – lnafziger

+0

@lnafziger लोकेल और टाइमज़ोन स्वतंत्र गुणों के लिए हैं। निश्चित प्रारूप दिनांक/समय तारों के साथ काम करते समय लोकेल 'en_US_POSIX' का उपयोग करना महत्वपूर्ण है। इसके बिना, यह संभव है कि उपयोगकर्ता की 24 घंटे की सेटिंग (एक उदाहरण के रूप में) जैसी चीज़ों के आधार पर प्रारूप आपकी पीठ के पीछे बदल दिया जाएगा। लोकेल को सेट करने से प्रारूप के समय क्षेत्र पर कोई प्रभाव नहीं पड़ता है। QA1480 देखें कि @Tommy ने उनके जवाब में संदर्भित किया। – rmaddy

1

स्वरूपण स्ट्रिंग eee, dd MMM yyyy HH:mm:ss zzz के साथ बस NSDateFormatter का उपयोग करें। अंत में जेड स्ट्रिंग से समय क्षेत्र को पढ़ने का कारण बनता है।

तो, QA1480 दिया, नमूना कोड:

NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease]; 
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease]; 
[formatter setLocale:usLocale]; 
[formatter setDateFormat:@"eee, dd MMM yyyy HH:mm:ss zzz"]; 
_createdAt = [formatter dateFromString:dateString]; 
+0

मेरे प्रश्न के लिंक में, उन्होंने 'NSTimeZone * gmt = [NSTimeZone timeZoneWithAbount: @" GMT "] का उपयोग किया; [डेटफॉर्मेटर सेटटाइमज़ोन: जीएमटी]; 'आपको इसकी आवश्यकता क्यों नहीं है? – hzxu

+0

आपको लगता है कि जरूरत नहीं है क्योंकि अपने स्ट्रिंग यह और 'आप' NSDateFormatter' बताएंगे कि आपकी स्ट्रिंग जो कुछ भी यह मानता है होना करने के लिए आदर्श के बजाय निर्दिष्ट करता है उपयोग करने के लिए होगा निर्धारित किया है दिनांक स्वरूप की zzz' घटक में जीएमटी निर्दिष्ट करता है। – Tommy

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