reloj problemas pone hora fecha con cambia bien atrasa actualiza objective-c cocoa-touch ios nstimezone

objective-c - pone - problemas con el reloj iphone 5c



iPhone-Diferencias entre los métodos de conveniencia de zona horaria (1)

Veo que NSTimeZone tiene estos métodos:

defaultTimeZone localTimeZone systemTimeZone

¿Puede alguien explicarme, en términos sencillos, cuáles son las diferencias entre esas llamadas y cuándo se debe usar una en lugar de la otra? No entiendo nada dentro de los documentos de Apple sobre esto.


El lenguaje en los documentos es un poco seco, sin duda, y la similitud de los nombres es potencialmente confusa. Citaré los documentos de NSTimeZone aquí e intentaré explicarlos:

systemTimeZone
La zona horaria actualmente utilizada por el sistema. Si no se puede determinar la zona horaria actual, devuelve la zona horaria GMT.

Esta es la zona horaria en la que el dispositivo cree que se encuentra; a menudo se configura automáticamente y luego se correspondería con la ubicación física del dispositivo, pero si el usuario ha establecido explícitamente una zona horaria particular en la aplicación de configuración, eso es lo que obtendrá.

defaultTimeZone
La zona horaria predeterminada para la aplicación actual. Si no se ha establecido una zona horaria predeterminada, este método invoca a systemTimeZone y devuelve la zona horaria del sistema.

Se permite que su aplicación establezca su propia zona horaria, de modo que pueda realizar acciones como si el dispositivo estuviera en otra zona, pero sin afectar la zona horaria del sistema (y, por lo tanto, otras aplicaciones). La configuración se realiza con una llamada a setDefaultTimeZone: Si no lo has hecho, esta llamada es idéntica a la llamada a systemTimeZone .

localTimeZone
Un objeto que reenvía todos los mensajes a la zona horaria predeterminada para la aplicación actual. La zona horaria local representa el estado actual de la zona horaria predeterminada en todo momento.

Aquí es donde se pone un poco complicado. localTimeZone te da casi el mismo resultado que defaultTimeZone . La diferencia es que la instancia específica de NSTimeZone que obtiene de localTimeZone siempre reflejará la configuración que haya realizado en la zona horaria dentro de su aplicación. Puede llamarlo una vez, guardar el resultado y obtener siempre la zona horaria simulada actual a través de ese objeto, sin importar los cambios realizados. Es como si, cuando usas esta instancia de NSTimeZone , el marco esté llamando a defaultTimeZone por ti, para asegurarte de que siempre obtengas el valor actual.

Aquí hay un par de breves ilustraciones de lo anterior. El objeto NSTimeZone que recupera de systemTimeZone representa la zona horaria del sistema en el momento en que realiza la llamada. Si vuelves a llamar a systemTimeZone , incluso si el usuario ha cambiado la zona horaria, obtendrás el mismo. Su aplicación almacena en caché ese valor y debe pedirle al sistema que lo resetSystemTimeZone con resetSystemTimeZone para obtener la actualización.

// Say that device is in GMT originally NSLog(@"%@", [NSTimeZone systemTimeZone]); // GMT // User flies into Rome and iPhone changes the zone automatically NSLog(@"%@", [NSTimeZone systemTimeZone]); // Still GMT [NSTimeZone resetSystemTimeZone]; // Clear app''s cache NSLog(@"%@", [NSTimeZone systemTimeZone]); // Now GMT+2

Algo similar sucede con defaultTimeZone . Cuando llama a ese método, obtiene un objeto que siempre representará la misma zona horaria, incluso si más tarde llama a setDefaultTimeZone: Sin embargo, si usa el objeto que obtiene de localTimeZone , seguirá el cambio que realice en la zona horaria predeterminada *.

// Say that defaultTimeZone is originally GMT NSTimeZone * myDefaultTZ = [NSTimeZone defaultTimeZone]; NSTimeZone * myLocalTZ = [NSTimeZone localTimeZone]; [NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithName:@"Etc/GMT-4"]]; NSLog(@"%@", myDefaultTZ); // Still gives GMT NSLog(@"%@", [NSTimeZone defaultTimeZone]); // GMT-4, the new value NSLog(@"%@", myLocalTZ); // Also the new value!

Apple parece recomendar el uso de localTimeZone :

con el método de clase localTimeZone, puede obtener un objeto de zona horaria relativa que se decodifica para convertirse en la zona horaria predeterminada en cualquier computadora en la que se encuentre.

* Tenga en cuenta que localTimeZone todavía está sujeto a la caché de nivel de aplicación de la zona horaria del sistema. Solo cambia para seguir la configuración de la zona horaria predeterminada .