Dans Cocoa, comment utiliser NSTimeZone pour obtenir le décalage de fuseau horaire du système sous forme de chaîne?
-
20-08-2019 - |
Question
Pour PDT, je voudrais & "; -0700 &";.
.J'obtiens une date dans le passé pour déterminer depuis combien de temps il s'est passé quelque chose.
NSDate *then = [NSDate dateWithString:@"1976-04-01 12:34:56 -0700"]; // Note the hard-coded time zone at the end
Je construirai la chaîne de date ailleurs, mais je ne sais pas comment accéder au fuseau horaire local.
J'ai lu les rubriques relatives à la programmation des dates et des heures Apple pour Cocoa, ainsi que les références de classe NSTimeZone et NSDate, mais il m'est trop difficile de rassembler les informations. Je pourrais vraiment utiliser quelques lignes de code juste pour montrer comment il est utilisé.
Mise à jour : en essayant de résoudre ce problème, j'écrivais du code à l'aide d'un modèle de ligne de commande afin de pouvoir essayer les choses rapidement. Je viens d'essayer mon code précédent sur iPhone et j'obtiens . NSDate pourrait ne pas répondre à '+ dateWithString:' : désolé si cela a ajouté à la confusion, qui aurait su qu'Apple changerait une classe aussi basique.
La solution
Le décalage de fuseau horaire dépend de la date dans une grande partie du monde & # 8212; les parties de celle-ci qui utilisent l'heure d'été / heure d'été.
Le seul moyen correct consiste à générer la chaîne entière à partir de la date et du fuseau horaire. Utilisez NSDateFormatter pour cela.
Autres conseils
Utilisez NSDateFormatter
pour créer NSDate à partir d'une chaîne:
NSDateFormatter *inputFormatter = [[NSDateFormatter alloc] init];
[inputFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *formatterDate;
formatterDate = [inputFormatter dateFromString:@"1976-04-01 12:34:56 -0700"];
NSString *dateString = [inputFormatter stringFromDate:formatterDate];
NSLog(@"date:%@", dateString);
De cette façon, vous obtenez l'heure locale à partir d'une chaîne, par exemple la date spécifiée par la chaîne:
" 1976-04-01 12:34:56 -0700 "
est dans le fuseau horaire - 0700
, (je suis dans le fuseau horaire GMT +1000), donc je reçois:
2009-11-17 22: 13: 46.480 cmdline [10593: 903] date: 1976-04-02 05:34:56 +1000
La meilleure solution consiste probablement à utiliser un simple formateur de calendrier
NSCalendarDate * date = [NSCalendarDate calendarDate];
[date setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PDT"]];
NSLog([date descriptionWithCalendarFormat:@"%z"]);
qui produira '-0700'
ou omettez la deuxième ligne si vous souhaitez connaître le fuseau horaire actuel du système (vous ne savez pas exactement ce que vous demandiez)