2011-09-20 22 views
14

के साथ समायोजित एनएसडीएट से एनएसडीएट प्राप्त करें मेरे पास एनएसडीएट ऑब्जेक्ट है। मान लें कि यह प्रतिनिधित्व करता है "2011/01/10"टाइमज़ोन

NSDate *date = [df dateFromString:@"2011-10-01 00:00:00"]; 

उस तारीख मेरा समय क्षेत्र की वजह से "2011-09-30 22:00:00" में तब्दील करते हैं।

प्रश्न: मैं अपने स्थानीय टाइमज़ोन में "2011-10-01 00:00:00" का प्रतिनिधित्व करने वाली एक नई तिथि वस्तु कैसे प्राप्त करूं?

+0

\t [डीएफ सेट लोकाले: [एनएसएलोकेल वर्तमान लॉकले]] का प्रयास करें; –

उत्तर

27

NSDate केवल समय में एक पूर्ण बिंदु का प्रतिनिधित्व उपयोग करना चाहिए। इसमें टाइमज़ोन या कैलेंडर की कोई अवधारणा नहीं है। जब आप एनएसडीएटी उदाहरण बनाते हैं तो यह 1 जनवरी 2001 जीएमटी के बाद से केवल कुछ सेकंड है! इससे कोई फर्क नहीं पड़ता कि आप न्यूयॉर्क, टोक्यो, बार्सिलोना या यरूशलेम में हैं।

आपके उदाहरण पर, आप जीएमटी के आधार पर एनएसडीएटी का उदाहरण देते हैं, लेकिन [date description] (NSLog में उपयोग किया जाता है) इसे आपके स्थानीय समय में अनुवाद करता है। वहां आपके पास मेल नहीं है।

तो वहाँ दो भागों ध्यान रखना आवश्यक हैः

1. NSDate सृजन (हिब्रू में 2012 ग्रेगोरी में है, लेकिन 5772) NSCalendar और NSTimeZone

आप एक तिथि बना रहे हैं मैन्युअल रूप से आप कैलेंडर को निर्दिष्ट करना चाहिए का उपयोग कर और समय क्षेत्र (22 पीएम लंदन समय, लेकिन 7AM सिडनी समय)।

// Use the user's current calendar and time zone 
NSCalendar *calendar = [NSCalendar currentCalendar]; 
[calendar setTimeZone: [NSTimeZone systemTimeZone]]; 

// Specify the date components manually (year, month, day, hour, minutes, etc.) 
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init]; 
[timeZoneComps setHour:22]; 
[timeZoneComps setMinute:0]; 
[timeZoneComps setSecond:0]; 
// ... year, month, ... 

// transform the date compoments into a date, based on current calendar settings 
NSDate *date = [calendar dateFromComponents:timeZoneComps]; 

इस बिंदु पर वर्तमान कैलेंडर का प्रतिनिधित्व करने वाले समय (सेकेंड में) सटीक बिंदु स्टोर करता है।

2. NSDate NSDateFormatter

का उपयोग कर अपने NSDate के नियंत्रित उत्पादन के लिए उत्पादन आप NSDateFormatter है, जो तार में दिनांक कन्वर्ट करने के लिए प्रयोग किया जाता है की जरूरत है।

एप्पल NSDateFormatter Class Reference प्रलेखन के आधार पर

कई गुण आप मिलता है और एक शैली तारीख को सेट फ़ॉर्मेटर कर सकते हैं आप प्रोत्साहित किया जाता है, हालांकि, बदलने के लिए नहीं अलग-अलग सेटिंग रहे हैं, ... । इसके बजाय यदि आप डिफ़ॉल्ट प्रारंभ पर स्थापित सेटिंग्स को स्वीकार करना चाहिए और setDateStyle :, setTimeStyle का उपयोग कर प्रारूप निर्दिष्ट करें:

यह आउटपुट है, जो हर स्थान के लिए अलग है के लिए विशेष रूप से महत्वपूर्ण है। डिफ़ॉल्ट रूप से NSDateFormatter वर्तमान उपयोगकर्ता की लोकेल सेटिंग्स को देखता है। तो एक ही एनएसडीएटी 22.11.2011 18:33:19, या Nov 22, 2011 6:33:19 PM, या 2011-11-22 下午6:33:19 या २२-११-२०११ ६:३३:१९ अपराह् हो सकता है, सभी एक ही इनपुट और उसी कोड के साथ।

और कोड:

// NSDate *date -> NSString *dateString 

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
[dateFormatter setTimeStyle:NSDateFormatterShortStyle]; 

// Medium style date, short style time => "Nov 23, 1937 3:30pm" 
NSString *dateString = [dateFormatter stringFromDate:date]; 

या आप वर्ग विधि localizedStringFromDate:dateStyle:timeStyle:

मुझे आशा है कि इस समस्या को स्पष्ट करता है का उपयोग कर इसे बदलना सकता है।

6

[NSDate date] जीएमटी में तारीख लौटाता है।

जब आप राज्य:

उस तारीख मेरी समय क्षेत्र की वजह से "2011-09-30 22:00:00" में तब्दील हो।

क्या NSLog या NSDateFormatter से है? [date description] पर भरोसा न करें जो एनएसएलओजी उपयोग करता है, यह आपके स्थानीय टाइमज़ोन को ध्यान में रखता है, NSDateFormatter का उपयोग करें। NSDateFormatter में setTimeZone विधि है।

एप्पल डॉक्स से [date description] पर:

प्रतिनिधित्व ऑपरेटिंग सिस्टम की अलग विज्ञप्ति भर में लगातार रहने के लिए गारंटी नहीं है। एक तारीख फ़ॉर्मेट करने के लिए, आप एक तारीख फ़ॉर्मेटर वस्तु बजाय

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