2011-09-16 3 views
3

Je cours le code suivant:NSDate est 5 heures de désactivation

NSDate * now = [NSDate date];

NSLog(@"now: %@", now); 

et obtenez:

2011-09-16 16: 14: 16,434 iSavemore [1229: 7907] maintenant: 2011-09-16 21:14:16 +0000

Comme vous peut voir que je cours ceci à 16:14:16 (4:14 pm) mais NSDate est de retour 21:16:16 (21:14 pm!). Est-ce un problème Xcode4 ou un problème NSDate?

+0

Est-ce sur un appareil ou dans le simulateur? – DarkDust

Répondre

9

par défaut NSDate le fuseau horaire universel (aka GMT).

Je suppose que vous êtes quelque part sur la côte est, 5 heures de retard sur l'UTC.

Essayez d'ajouter ceci à votre formatter date ...

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 

[dateFormatter setLocale:[NSLocale currentLocale]]; 

... et vous devriez voir votre heure locale.

Si vous souhaitez utiliser un environnement local spécifié plutôt que 'currentLocale', créez un NSLocale pour les paramètres régionaux appropriés.

NSLocale *usLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; 

[dateFormatter setLocale:usLoc]; 

... en fait que des États-Unis est (donc peut-être pas au centre).

aide fuseau horaire plus spécifiques peuvent être trouvés ici ...

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/Reference/Reference.html

Cependant, si vous voulez afficher l'heure d'expiration, ne vous voulez toujours dans currentLocale de l'utilisateur?

+0

Im dans le fuseau horaire central et je dois forcer NSDate à rester dans la cause centrale Je dois calculer une date d'expiration et il sera basé à partir de Dallas, peu importe où l'utilisateur est. Comment je fais ça? –

+0

J'ai modifié ma réponse ci-dessus pour vous aider. – Snips

-1

Juste une conjecture sauvage ici, mais peut-être que cela a quelque chose à voir avec les fuseaux horaires?

0

réglez le paramètre fuseau horaire de votre NSDate à celui qui convient à vos besoins, par exemple [NSTimeZone localTimeZone]

5

Si vous regardez la sortie, vous verrez que le journal comprend le fuseau horaire:

2011-09-16 16:14:16.434 iSavemore[1229:7907] now: 2011-09-16 21:14:16 +0000 
                     ^^^^^^ 

L'horodatage de votre journal est l'heure locale. Je suppose que vous êtes dans un fuseau horaire qui est de 5 heures d'avance sur UTC.

Un NSDate fait référence à un moment particulier. C'est à vous de l'afficher comme vous le voulez; généralement avec un NSDateFormatter.

C'est la raison pour laquelle vous verrez de nombreuses recommandations contre l'enregistrement d'une heure ou d'une date autre que NSDate. Si vous essayez de le stocker comme une chaîne, vous rencontrerez beaucoup de problèmes plus tard lorsque vous essayerez de gérer l'affichage dans différents fuseaux horaires.

Questions connexes