ios datetime uilocalnotification

ios - Entendiendo UILocalNotification timeZone



datetime (2)

De los documentos:

La fecha especificada en fireDate se interpreta de acuerdo con el valor de esta propiedad. Si especifica nil (el valor predeterminado), la fecha de activación se interpreta como una hora GMT absoluta, que es adecuada para casos como los temporizadores de cuenta regresiva. Si asigna un objeto NSTimeZone válido a esta propiedad, la fecha de incendio se interpreta como una hora de reloj de pared que se ajusta automáticamente cuando hay cambios en las zonas horarias; Un ejemplo adecuado para este caso es un reloj de alarma.

Supongamos que programo una notificación local para (a la hora absoluta) mañana a las GMT. Programo esto en Seattle a la 1PM (hora del Pacífico, GMT-8), y luego viajo a Chicago inmediatamente llegando a las 11PM (hora central), GMT-6. Mi dispositivo se ajusta de la hora del Pacífico a la hora central. Por favor, ayúdeme a comprender cuándo ocurrirá mi notificación en los siguientes tres casos:

  1. UILocalNotification timeZone se estableció en nulo.
  2. UILocalNotification timeZone se estableció en GMT.
  3. UILocalNotification timeZone se estableció en Hora del Pacífico.

Acabo de ejecutar algunas pruebas en iOS 6.1.3. Esto es lo que tengo:

Estoy en Seattle, a la 1:00 PM (hora del Pacífico, GMT-7). He creado un 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];

ahora tengo

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

Luego creé y programé las notificaciones:

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

Registros de las notificaciones recién creadas, en Seattle (Hora de verano del Pacífico, 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

Cambié la zona horaria del teléfono a Chicago, donde ahora son las 3:00 PM (horario de verano central, GMT-5).

Registros de las notificaciones, en Chicago (Hora de verano central, 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

Conclusiones:

  1. Cuando UILocalNotification timeZone es nulo, la fecha de disparo se fija en el tiempo. Eso significa que la notificación se activará a las 12:00 PM GMT-7, a las 2:00 PM GMT-5, o a las 7:00 GMT.
  2. Cuando UILocalNotification timeZone se establece en GMT, la fecha de disparo se calcula para la hora GMT y se actualizará automáticamente si el usuario va a otra zona horaria. En este ejemplo, la hora 12:00 GMT-7 se convirtió a las 19:00 GMT, y la notificación se configuró a las 19:00 hora local, independientemente de la zona horaria en la que se encuentre (19:00 GMT, 19:00 GMT-5 o 19:00 GMT-7).
  3. Cuando UILocalNotification timeZone se establece en la zona horaria local (Hora de verano del Pacífico, GMT-7), la fecha de disparo se calcula para la hora local y se actualizará automáticamente si el usuario va a otra zona horaria. En este ejemplo, la hora era 12:00 GMT-7, por lo que la notificación se activará a las 12:00 hora local, independientemente de la zona horaria en la que se encuentre (12:00 GMT, 12:00 GMT-5 o 12:00 GMT- 7).

En Swift 3, use TimeZone.autoupdatingCurrent para comportarse igual que [NSTimeZone defaultTimeZone] -C [NSTimeZone defaultTimeZone] .