NSDate exprimé dans des fuseaux horaires différents, c'est à dire l'heure locale (GMT-400) PST
Je sais comment les utiliser NSTimeZone pour dériver le décalage de l'heure actuelle dans un autre fuseau horaire. NSDate retourne toujours par rapport à l'heure GMT, alors comment puis-je tirer d'une chaîne avec le bon fuseau horaire de l'information? c'est à dire je prends le temps actuel, où je suis (dans l'est) et à l'aide de NSTimeZone finissent en soustrayant les 3 heures est nécessaire de représenter le temps dans le PST. Mais tout ce que j'ai fait est de soustraire de 3 heures à partir du moment qui est toujours représenté par rapport à mon fuseau horaire. Comment puis-je obtenir NSDateFormatter à cracher le temps en utilisant le fuseau horaire de destination?
Punaise j'ai essayé était:
NSCalendar *cal = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; //for PST
NSDateComponents *dc = [cal components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit fromDate:now];
[cal setTimeZone:tz];
NSDate *newDate = [cal dateFromComponents:dc];
Pas d'amour. Je pourrais prendre l'individuelle date de composants et de composer une chaîne de caractères, mais il ne serait pas localisable.
Un problème connexe:
NSTimeZone *tz = [NSTimeZone timeZoneForSecondsFromGMT:(-8 * 3600)]; //for PST
NSString *abbreviation = [tz abbreviation];
NSString *name = [tz name];
Les deux abbreviation
et name
finit par revenir GMT-0800
, pas PST comme je l'avais espérer. Donc, je ne pouvais même pas faire la dessus si je le voulais. Ce que je fais mal?
OriginalL'auteur rsswtmr | 2010-03-23
Vous devez vous connecter pour publier un commentaire.
Ce n'est pas logique. NSDate juste encapsule une absolue moment dans le temps (oublions la relativité pour une seconde) et il n'a pas de notion de fuseaux horaires que ce soit. Dire que NSDate fois le sont par rapport à l'heure GMT est faux.
À la sortie d'une date dans un fuseau horaire spécifique, vous devez créer une instance de
NSDateFormatter
et appelsetTimeZone:
sur elle pour définir le fuseau horaire. Selon le Unicode docs, la chaîne de format@"zzz"
devrait en sortie la valeur du fuseau horaire "PST".Hm, peut-être NSDateFormatter ne reconnaît que ces fuseau horaire spécificateurs de format lors de la conversion d'une chaîne de date à NSDate et pas l'inverse? L'Unicode, les specs, j'ai lié ci-dessus semblent donner des maîtres d'œuvre d'une grande marge de manœuvre sur la façon d'afficher le fuseau horaire info si fuseaux horaires de noms ne sont pas disponibles. Je ne sais vraiment pas comment cela fonctionne dans le détail. Et google n'a pas de découvrir de bien, soit.
J'ai testé un peu et a trouvé que la chaîne de format
@"zzz"
sera en effet la sortie de "PDT" (pour la date d'aujourd'hui). Toutefois, cela ne fonctionnera que si le fuseau horaire que vous définissez pour la date de formateur a été créé avec un nom ou une abréviation au lieu de simplement le nombre de secondes depuis l'GMT:[NSTimeZone timeZoneWithAbbreviation:@"PST"]
. Je suppose que c'est logique, puisque le système a aucun moyen de dire qui de temps spécifique de la zone que vous voulez dire. J'ai également eu à régler la date de formatage de la locale fr-fr explicitement.Ouais, il m'a été signalé hier que GMT-05:00 pourrait tout aussi bien représenter le Pérou Temps ou la colombie Temps ainsi que de l'Heure normale de l'est. Encore une fois, je ne sais pas pourquoi ne pas se produire pour moi. Les seules informations de fuseau horaire-je obtenir à partir de nos serveurs est heures de décalage de GMT, donc je suppose que nous allons avoir à renoncer à la belle époque de la zone de description. Merci pour votre aide.
OriginalL'auteur Ole Begemann