2013-08-25 9 views
19

डॉक्स से:समझौता UILocalNotification समयक्षेत्र

तारीख fireDate में निर्दिष्ट इस संपत्ति के मूल्य के अनुसार व्याख्या की है। आप नहीं के बराबर (डिफ़ॉल्ट) निर्दिष्ट करते हैं, आग तारीख एक निरपेक्ष GMT समय है, जो इस तरह के उलटी गिनती टाइमर के रूप में मामलों के लिए उपयुक्त है के रूप में व्याख्या है। आप इस संपत्ति के लिए एक वैध NSTimeZone वस्तु असाइन करते हैं, आग की तारीख एक दीवार घड़ी का समय है कि है स्वचालित रूप से समायोजित जब वहाँ समय क्षेत्र में परिवर्तन कर रहे हैं के रूप में व्याख्या की है, एक उदाहरण इस मामले के लिए उपयुक्त एक अलार्म घड़ी है।

मान लीजिए मैं के लिए एक स्थानीय अधिसूचना अनुसूची दोपहर कल जीएमटी (निरपेक्ष समय में)। मैं इसे 1 पीएम (पैसिफ़िक टाइम, जीएमटी -8) पर सिएटल में शेड्यूल करता हूं, फिर तुरंत 11 पीएम (सेंट्रल टाइम, जीएमटी -6) पहुंचने वाले शिकागो की यात्रा करता हूं। मेरा डिवाइस प्रशांत समय से केंद्रीय समय तक समायोजित करता है। कृपया मेरी मदद को समझने जब मेरे अधिसूचना निम्नलिखित तीन मामलों में हो जाएगा:

  1. UILocalNotification समयक्षेत्र नहीं के बराबर करने के लिए स्थापित किया गया था।
  2. UILocalNotification timeZone जीएमटी पर सेट किया गया था।
  3. UILocalNotification timeZone प्रशांत समय पर सेट किया गया था।

उत्तर

41

मैं सिर्फ आईओएस 6.1.3 पर कुछ परीक्षण भाग गया। (, प्रशांत डेलाइट समय जीएमटी -7),

मैं सिएटल में हूँ 1:00 पर: यहाँ मैं क्या मिला है।

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
// 2013-08-31 @ 12:00:00 (noon) 
dateComponents.year = 2013; 
dateComponents.month = 8; 
dateComponents.day = 31; 
dateComponents.hour = 12; 
dateComponents.minute = 0; 
dateComponents.second = 0; 

NSDate *fireDate = [gregorianCalendar dateFromComponents:dateComponents]; 

अब मैं

fireDate = 2013-08-31 19:00:00 +0000 (2013-08-31 12:00:00 -0700) 

तब मैं बनाया और सूचनाएं निर्धारित नहीं की:: मैं एक NSDate बनाया सिएटल (प्रशांत डेलाइट समय में

notification1 = [[UILocalNotification alloc] init]; 
notification1.fireDate = fireDate; 
// notification1.timeZone is nil by default 

NSLog(@"%@", notification1); 

notification2 = [[UILocalNotification alloc] init]; 
notification2.fireDate = fireDate; 
notification2.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"]; 

NSLog(@"%@", notification2); 

notification3 = [[UILocalNotification alloc] init]; 
notification3.fireDate = fireDate; 
notification3.timeZone = [NSTimeZone defaultTimeZone]; 

NSLog(@"%@", notification3); 

सूचनाएं अभी बनाया का लॉग्स, , जीएमटी -7):

notification1: 
fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time, 
time zone = (null), 
next fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time 

notification2: 
fire date = Saturday, August 31, 2013, 7:00:00 PM GMT, 
time zone = GMT (GMT) offset 0, 
next fire date = Saturday, August 31, 2013, 7:00:00 PM Pacific Daylight Time 

notification3: 
fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time, 
time zone = US/Pacific (PDT) offset -25200 (Daylight), 
next fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time 

मैंने फोन के टाइमज़ोन को शिकागो में बदल दिया, जहां अब यह 3:00 बजे (सेंट्रल डेलाइट टाइम, जीएमटी -5) है।

सूचनाओं के लॉग्स, शिकागो में (केन्द्रीय डेलाइट समय, GMT-5)

notification1: 
fire date = Saturday, August 31, 2013, 2:00:00 PM Central Daylight Time, 
time zone = (null), 
next fire date = Saturday, August 31, 2013, 2:00:00 PM Central Daylight Time 

notification2: 
fire date = Saturday, August 31, 2013, 7:00:00 PM GMT, 
time zone = GMT (GMT) offset 0, 
next fire date = Saturday, August 31, 2013, 7:00:00 PM Central Daylight Time 

notification3: 
fire date = Saturday, August 31, 2013, 12:00:00 PM Pacific Daylight Time, 
time zone = US/Pacific (PDT) offset -25200 (Daylight), 
next fire date = Saturday, August 31, 2013, 12:00:00 PM Central Daylight Time 

निष्कर्ष:

  1. UILocalNotification timeZone नहीं के बराबर है जब, आग दिनांक समय में तय हो गई है। इसका मतलब है कि अधिसूचना 12:00 बजे जीएमटी -7, 2:00 अपराह्न GMT-5, या 7:00 GMT पर निकाल दी जाएगी।
  2. जब UILocalNotification timeZone जीएमटी पर सेट है, तो आग की तारीख जीएमटी समय के लिए गणना की जाती है और यदि उपयोगकर्ता किसी अन्य समय क्षेत्र में जाता है तो स्वतः अपडेट हो जाएगा। इस उदाहरण में, 12:00 जीएमटी -7 का समय 1 9: 00 जीएमटी में परिवर्तित कर दिया गया था, और अधिसूचना 1 9:00 स्थानीय समय पर निर्धारित की गई थी, जो भी समय क्षेत्र हम हैं (1 9: 00 जीएमटी, 1 9: 00 जीएमटी -5 या 1 9: 00 जीएमटी -7)।
  3. जब UILocalNotification timeZone स्थानीय समय क्षेत्र (प्रशांत डेलाइट टाइम, जीएमटी -7) पर सेट है, तो आग की तारीख स्थानीय समय के लिए गणना की जाती है और यदि उपयोगकर्ता किसी अन्य समय क्षेत्र में जाता है तो स्वतः अपडेट हो जाएगा। इस उदाहरण में, समय 12:00 जीएमटी -7 था, इसलिए अधिसूचना 12:00 स्थानीय समय पर निकाल दी जाएगी, जो भी समय क्षेत्र हम हैं (12:00 जीएमटी, 12:00 जीएमटी -5 या 12:00 जीएमटी- 7)।
+0

बहुत बढ़िया। तकनीकी रूप से आपने इसे दोपहर के बजाय 7 पीएम जीएमटी के लिए निर्धारित किया है, लेकिन यह सवाल भी जवाब देता है। –

+1

क्या किसी के पास आईओएस 10 में यूएन नोटिफिकेशन ट्रिगर तिथियों के बारे में एक समान जांच है? – Jonny

+0

@ जॉनी मैं भी सोच रहा हूं। ऐसा लगता है कि टाइमज़ोन को कोई फर्क नहीं पड़ता है। – David

0

स्विफ्ट 3 में, TimeZone.autoupdatingCurrent का उपयोग के रूप में उद्देश्य सी [NSTimeZone defaultTimeZone] ही व्यवहार करने के लिए।

+0

यह ओपी का जवाब नहीं देता है। क्या आपके पास कोई और जानकारी है। – David

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