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 asystemTimeZone
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 .