2013-08-25 14 views
19

Od docs:Zrozumienie UILocalNotification stref czasowych

w terminie określonym w fireDate jest interpretowana zgodnie z wartością tej nieruchomości. Jeśli podasz wartość zerową (domyślną), data wybuchu jest interpretowana jako bezwzględny czas GMT, który jest odpowiedni dla przypadków takich jak jako czasomierze odliczające. Jeśli przypiszesz prawidłowy obiekt NSTimeZone do tej właściwości , data pożaru zostanie zinterpretowana jako godzina zegara ściennego o wartości automatycznie dostosowywana w przypadku zmian w strefach czasowych; Przykładem odpowiednim dla tego przypadku jest budzik.

Załóżmy, że zaplanuję lokalne powiadomienie na (jutro) w południe (GMT). Zaplanowałem to w Seattle o 1PM (czas pacyficzny, GMT-8), a następnie natychmiast udam się do Chicago, gdzie przybywa 11 PM (czas centralny, GMT-6). Moje urządzenie dostosowuje się z czasu pacyficznego do czasu centralnego. Pomóż mi zrozumieć, kiedy powiadomienie pojawi się w następujących trzech przypadkach:

  1. UILocalNotification timeZone został ustawiony na zero.
  2. UILocalNotification timeZone został ustawiony na GMT.
  3. UILocalNotification timeZone został ustawiony na czas pacyficzny.

Odpowiedz

41

Właśnie przeprowadziłem testy na iOS 6.1.3. Oto, co mam:

Jestem w Seattle, o 13:00 (czas letni Pacyfiku, GMT-7). I stworzył NSDate:

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]; 

teraz mam

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

Potem stworzył i zaplanowane powiadomień:

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); 

dzienników powiadomień właśnie utworzony w Seattle (Pacific Daylight Time , GMT-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 

Zmieniłem strefę czasową telefonu na Chicago, gdzie teraz jest godzina 15:00 (centralny czas letni, GMT-5).

Kłody zgłoszeń, w Chicago (Central Daylight Time, 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 

Wnioski:

  1. Kiedy UILocalNotification timeZone jest zerowa, data ogień jest stała w czasie. Oznacza to, że powiadomienie zostanie uruchomione o godzinie 12:00 GMT-7, 2:00 PM GMT-5 lub 7:00 GMT.
  2. Po ustawieniu UILocalNotification timeZone na GMT, data pożaru jest obliczana dla czasu GMT i będzie automatycznie aktualizowana, jeśli użytkownik przejdzie do innej strefy czasowej. W tym przykładzie czas 12:00 GMT-7 został zmieniony na 19:00 GMT, a powiadomienie zostało ustawione na 19:00 czasu lokalnego, bez względu na to, gdzie jesteśmy (19:00 GMT, 19:00 GMT-5 lub 19:00 GMT-7).
  3. Po ustawieniu UILocalNotification timeZone na lokalną strefę czasową (Pacyficzny czas letni, GMT-7), data pożaru jest obliczana dla czasu lokalnego i będzie automatycznie aktualizowana, jeśli użytkownik przejdzie do innej strefy czasowej. W tym przykładzie czas wyniósł 12:00 GMT-7, więc powiadomienie zostanie uruchomione o 12:00 czasu lokalnego, bez względu na strefę czasową, w której się znajdujemy (12:00 GMT, 12:00 GMT-5 lub 12:00 GMT- 7).
+0

Awesome. Technicznie zaplanowałeś to na 7 GMT zamiast w południe, ale odpowiada również na pytanie. –

+1

Czy ktoś ma podobne dochodzenie dotyczące dat wywołania UNNotification w iOS 10? – Jonny

+0

@ Jonny też się nad tym zastanawiam. Wygląda na to, że ustawienie strefy czasowej nie ma znaczenia. – David

0

W Swift 3 użyj TimeZone.autoupdatingCurrent, aby zachowywać się tak samo jak cel - C [NSTimeZone defaultTimeZone].

+0

To nie odpowiada na PO. Czy masz jakieś dalsze informacje. – David

Powiązane problemy