51 votes

iPhone - Différences entre les méthodes pratiques de fuseau horaire

Je vois que NSTimeZone a ces méthodes:

 defaultTimeZone  
localTimeZone  
systemTimeZone
 

Quelqu'un peut-il m'expliquer, en termes simples, quelles sont les différences entre ces appels, et quand utiliser l'un au lieu de l'autre? Je ne comprends rien dans les documents Apple à ce sujet.

74voto

Josh Caswell Points 40397

La langue dans les docs est un peu sur le côté sec, pour être sûr, et de la similitude des noms est potentiellement source de confusion. Je vais vous citer l' NSTimeZone docs ici et essayer de les expliquer:

systemTimeZone
Le fuseau horaire actuellement utilisées par le système. Si le fuseau horaire actuel ne peut pas être déterminé, renvoie le fuseau horaire GMT.

C'est le temps de la zone où l'appareil croit qu'il est; c'est souvent automatiquement, et correspondent à la physique de l'unité de lieu, mais si l'utilisateur a explicitement définir un fuseau horaire particulier dans l'Application des Paramètres, c'est ce que vous allez obtenir.

defaultTimeZone
Le fuseau horaire par défaut pour l'application en cours. Si aucun fuseau horaire par défaut a été définie, cette méthode appelle systemTimeZone et renvoie le fuseau horaire du système.

Votre application est autorisé à établir son propre fuseau horaire, de sorte que vous pouvez effectuer des actions comme si l'appareil était dans une autre zone, mais sans affecter le fuseau horaire du système (et donc d'autres applications). Le réglage est effectué avec un appel à l' setDefaultTimeZone:. Si vous n'avez pas fait cela, cet appel est identique à l'appel de systemTimeZone.

localTimeZone
Un objet qui transmet tous les messages de le fuseau horaire par défaut pour l'application en cours. Le fuseau horaire local représente l'état actuel de l'heure par défaut de la zone à tout moment.

C'est là que ça devient un peu difficile. localTimeZone vous donne presque le même résultat que l' defaultTimeZone. La différence, c'est que l' NSTimeZone exemple vous obtenez à partir d' localTimeZone reflète toujours le réglage que vous avez effectué dans le fuseau horaire à l'intérieur de votre application. Vous pouvez appeler ça une fois, enregistrez le résultat, et de toujours obtenir le courant de temps simulé de la zone par le biais de cet objet, peu importe les changements effectués. C'est comme si, lorsque vous utilisez cette NSTimeZone de l'instance, le cadre est en appelant defaultTimeZone pour vous, afin d'être sûr que vous obtenez toujours la valeur actuelle.

Voici quelques brèves illustrations ci-dessus. L' NSTimeZone objet que vous obtenez de retour de systemTimeZone représente le fuseau horaire du système au moment de l'appel. Si vous appelez systemTimeZone encore, même si l'utilisateur a changé depuis le temps de la zone, vous obtiendrez le même. Votre application dans les caches de la valeur, et vous devez vous demander le système à claire-il avec resetSystemTimeZone pour obtenir la mise à jour.

// 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

Une chose semblable se produit avec defaultTimeZone. Lorsque vous appelez cette méthode, vous obtenez un objet qui représentera toujours le même fuseau horaire, même si plus tard vous appelez setDefaultTimeZone:. Toutefois, si vous utilisez l'objet que vous obtenez à partir d' localTimeZone,, il suivra le changement que vous faites dans le fuseau horaire par défaut*.

// 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 semble recommandons l'utilisation d' localTimeZone:

avec le localTimeZone méthode de classe, vous pouvez obtenir un temps relatif à la zone de l'objet qui décode lui-même pour devenir le fuseau horaire par défaut sur n'importe quel ordinateur sur lequel elle se trouve.


*Notez qu' localTimeZone est toujours sous réserve de l'application-niveau de cache du système de fuseau horaire. Il change seulement de suivre votre réglage de la valeur par défaut de fuseau horaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X