Question

je vois ça 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 l'un devrait être utilisé à la place de l'autre? Je ne comprends rien à l'intérieur des documents Apple à ce sujet.

Était-ce utile?

La solution

La langue des documents est un peu sèche, bien sûr, et la similitude des noms est potentiellement déroutante. Je vais citer le NSTimeZone docs Ici et essayez de les expliquer:

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

C'est le fuseau horaire dans lequel l'appareil pense qu'il se trouve; Il est souvent défini automatiquement et correspondait ensuite à l'emplacement physique de l'appareil, mais si l'utilisateur a explicitement définie un fuseau horaire particulier dans l'application Paramètres, c'est ce que vous obtiendrez.

defaultTimeZone
Le fuseau horaire par défaut pour l'application actuelle. Si aucun fuseau horaire par défaut n'a été défini, cette méthode invoque systemTimeZone et renvoie le fuseau horaire du système.

Votre application est autorisée à définir son propre fuseau horaire, afin que vous puissiez effectuer des actions comme si l'appareil se trouvait dans une autre zone, mais sans affecter le fuseau horaire du système (et ainsi d'autres applications). Le paramètre est effectué avec un appel à setDefaultTimeZone:. Si vous ne l'avez pas fait, cet appel est identique à l'appel systemTimeZone.

localTimeZone
Un objet qui transmet tous les messages au fuseau horaire par défaut pour l'application actuelle. Le fuseau horaire local représente à tout moment l'état actuel du fuseau horaire par défaut.

C'est là que ça devient un peu délicat. localTimeZone vous donne presque le même résultat que defaultTimeZone. La différence est que le spécifique NSTimeZone Instance que vous obtenez de localTimeZone reflétera toujours le paramètre que vous avez fait sur le fuseau horaire de votre application. Vous pouvez l'appeler une fois, enregistrer le résultat et toujours obtenir le fuseau horaire simulé actuel via cet objet, peu importe les modifications apportées. C'est comme si, lorsque vous utilisez ceci NSTimeZone Par exemple, le cadre appelle defaultTimeZone Pour vous, pour être sûr que vous obtenez toujours la valeur actuelle.

Voici quelques brèves illustrations de ce qui précède. La NSTimeZone objet dont vous revenez systemTimeZone représente le fuseau horaire du système au moment où vous passez l'appel. Si vous appelez systemTimeZone Encore une fois, même si l'utilisateur a changé depuis le fuseau horaire, vous obtiendrez le même. Votre application cache cette valeur, et vous devez demander au système de l'effacer 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 similaire 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 vous appelez plus tard setDefaultTimeZone:. Cependant, si vous utilisez l'objet dont vous obtenez localTimeZone, il suivra le changement que vous apportez au 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 recommande d'utiliser localTimeZone:

Avec la méthode de classe LocalTimeZone, vous pouvez obtenir un objet de fuseau horaire relatif qui se décode pour devenir le fuseau horaire par défaut sur n'importe quel ordinateur sur lequel il se trouve.


*Notez que localTimeZone est toujours soumis au cache au niveau de l'application du fuseau horaire du système. Il ne change que pour suivre votre réglage du défaut fuseau horaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top