2011-08-30 4 views
4

Lorsque j'appelle NSTimeZone’s méthode d'abréviation il renvoie GMT-07:00. Puis, quand j'utilise cette valeur pour rechercher le nom de fuseau horaire ou (time zone identifier), elle retourne nil.Comment convertir un abréviation de décalage de fuseau horaire en identifiant officiel de fuseau horaire?

J'ai besoin de récupérer le time zone identifier officiel, par exemple, . Par conséquent, comment puis-je convertir un abréviation de décalage de fuseau horaire (par exemple, GMT-07:00) en l'identificateur de fuseau horaire officiel?

Voici mon code:

NSTimeZone* localTimeZone = [NSTimeZone localTimeZone]; 
NSString* localAbbreviation = [localTimeZone abbreviation]; 
NSDictionary* abbreviationDictionary = [NSTimeZone abbreviationDictionary]; 
NSString* timeZoneID = 
[abbreviationDictionary objectForKey:localAbbreviation]; //should return 'America/Los_Angeles' if the abbreviation is ‘PDT’ 
+2

Ce n'est pas possible à mon avis. Il existe beaucoup plus de 24 fuseaux horaires. Un mappage exact du décalage horaire par rapport à un fuseau horaire réel est impossible. –

+0

Soit dit en passant, appelant '[[NSTimeZone LocalTimeZone] abréviation]' dans mes locale/emplacement @ elle retourne ' "CEST"' et non un décalage numérique. –

+1

Merci Ole, je reçois GMT-07: 00, qui est une abréviation de fuseau horaire local invalide. – johnnieb

Répondre

5

(je réécrit ma réponse, j'ai mal compris la question avant).

Voici un exemple sur la façon de convertir un timeZone de l'abréviation:

NSTimeZone* localTimeZone = [NSTimeZone localTimeZone]; 
NSString* localAbbreviation = [localTimeZone abbreviation]; 

Pour le transformer en retrait de la localAbbreviation, est juste une question de recréer fuseauHoraire:

NSTimeZone* timeZoneFromAbbreviation = [NStimeZone timeZoneWithAbbreviation:abbreviation]; 
NSString* timeZoneIdentifier = timeZoneAbbreviation.name; 

NSLog(@"Identifier: %@", timeZoneIdentifier); // Outputs America/Santiago for me. 

Etes-vous sûr que l'abréviation renvoie "GMT-07: 00"? Mine renvoie "CLT", pas un décalage GMT.

+1

Malheureusement, cela ne fonctionne pas lorsque la valeur du fuseau horaire local est exprimée en décalage GMT. Lorsque appeler la méthode de description de NSTimeZone J'obtiens ce qui suit: Zone Heure locale (Etc/GMT + 7 (GMT-07: 00) Le décalage de -25200) – johnnieb

+0

Bizarre, il devrait être de retour « PST », en fait, en regardant le contenu du dictionnaire ('NSLog (@ "timeZone:% @", [NSTimeZone abbreviationDictionary]);'), 'Amérique/Los_Angeles' est enregistré, mais le LocalTimeZone retourne la mauvaise abréviation ... Je vais essayer de changer la date de mon iPhone – Can

+0

Ok, j'ai changé le fuseau horaire dans mon iPhone à « Amérique/Los Angeles », et le code d'abréviation fonctionne normalement ('Identifiant: Amérique/Los_Angeles'). Désolé, je ne peux pas reproduire le problème. Si ça aide, mon 'timeZoneDataVersion' renvoie" 2010o ". – Can

2

espoir que cela pourrait être utile Modifier Le + devrait être là pour montrer exactement comme Abréviation normale

-(NSString*)getTimeZoneStringForAbbriviation:(NSString*)abbr{ 
     NSTimeZone *atimezone=[NSTimeZone timeZoneWithAbbreviation:abbr]; 
     int minutes = (atimezone.secondsFromGMT/60) % 60; 
     int hours = atimezone.secondsFromGMT/3600; 
     NSString *aStrOffset=[NSString stringWithFormat:@"%02d:%02d",hours, minutes]; 
     return [NSString stringWithFormat:@"GMT+%@",aStrOffset]; 
    } 
+0

excellente réponse avec une bonne calcualations et s'il vous plaît ajouter + dans stringWithFormat – ashokdy

+0

Est-ce que mettre « + » dans votre chaîne de format fonctionne pour les zones qui sont négatives de GMT? Tels que GMT-7: 00.Il pourrait être préférable de mettre + dans la première chaîne de format: stringWithFormat: @ "% + 02d:% 02d" Cela entraînera stringWithFormat à ajouter le + si le nombre est positif. (L'exemple ci-dessus pourrait ajouter un '-' aux minutes aussi bien pour les décalages GMT négatifs.) –

+0

Merci Ashok, mais en réalité + n'est pas valable pour tous les Timezones. Donc, ça ne peut pas être codé en dur, que dites-vous? Je pense que je dois mettre quelque chose dans le code. Donc je suis aussi d'accord avec @WaltSellers. – Mrug

Questions connexes