2013-08-25 2 views
19

Из документов:Понимание UILocalNotification TIMEZONE

даты, указанной в fireDate интерпретируется в соответствии со значением этого свойства. Если указать ноль (по умолчанию), дата огня интерпретируется как абсолютное время по Гринвичу, которое подходит для таких случаев как таймер обратного отсчета. Если присвоить действительный объект NSTimeZone к этой собственности, дата пожара интерпретируется как время от стены часы, которые автоматически корректируется при наличии изменений в часовых поясах; пример , подходящий для этого случая, является будильником.

Предположим, я планирую местное уведомление (в абсолютном времени) в полдень завтра. Я планирую это в Сиэтле в 1:00 (по тихоокеанскому времени, по Гринвичу-8), а затем немедленно отправляется в Чикаго, прибывая 11 вечера (Центральное время, GMT-6). Мое устройство настраивается с тихоокеанского времени на центральное время. Пожалуйста, помогите мне понять, когда мое уведомление будет происходить в следующих трех случаях:

  1. UILocalNotification timeZone был установлен в ноль.
  2. UILocalNotification timeZone был установлен в GMT.
  3. UILocalNotification TIMEZONE был установлен в тихоокеанское время.

ответ

41

Я просто провел несколько тестов на прошивке 6.1.3. Вот что я получил:

Я нахожусь в Сиэтле, в 1:00 вечера (по тихоокеанскому летнему времени, GMT-7). Я создал 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]; 

теперь у меня есть

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

Затем я создал и назначил уведомление:

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

бревна уведомлений только что создали, в Сиэтле (тихоокеанское летнее время , 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 

Я изменил часовой пояс телефона в Чикаго, где сейчас 3:00 PM (Central Daylight Time, GMT-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 PM GMT-7, 2:00 PM GMT-5 или 7:00 GMT.
  2. Когда UILocalNotification timeZone настроен на GMT, дата пожара рассчитывается для GMT и будет автоматически обновляться, если пользователь перейдет в другой часовой пояс. В этом примере время 12:00 GMT-7 было преобразовано в 19:00 по Гринвичу, и уведомление было установлено в 19:00 по местному времени, независимо от того, какой часовой пояс мы (19:00 GMT, 19:00 GMT-5 или 19:00 GMT-7).
  3. Когда UILocalNotification timeZone установлен в местный часовой пояс (Pacific Daylight Time, GMT-7), дата огня рассчитывается для местного времени и будет автоматически обновляться, если пользователь перейдет в другой часовой пояс. В этом примере время было 12:00 GMT-7, поэтому уведомление будет выпущено в 12:00 по местному времени, независимо от того, в какой часовой зоне мы находимся (12:00 GMT, 12:00 GMT-5 или 12:00 GMT- 7).
+0

Awesome. Технически вы запланировали это для 7PM GMT вместо полудня, но он также отвечает на вопрос. –

+1

Есть ли у кого-нибудь подобное расследование относительно дат запуска UNNotification в iOS 10? – Jonny

+0

@ Jonny Мне тоже интересно. Кажется, настройка часового пояса не имеет значения. – David

0

В Swift 3 используйте TimeZone.autoupdatingCurrent, чтобы вести себя так же, как объектив-C [NSTimeZone defaultTimeZone].

+0

Это не отвечает OP. У вас есть дополнительная информация. – David