NSDate date de méthode renvoie un résultat incorrect
Je sais qu'il ya beaucoup de questions de ce type, mais je n'ai pas trouver de solution pour mon cas;
J'ai besoin d'obtenir actuelles et correctes, NSDate
objet, pas NSString
!
Ce code retourne au mauvais moment (+3 heures), parce que je suis de l'Ukraine.
NSDate *currentDate = [NSDate date];
Comment obtenir de l'actuel NSDate
objet de NSDateFormatter
? Je sais seulement comment obtenir NSString
, mais je n'en ai pas besoin.
EDIT: je suis en utilisant ce code de comparer 2 NSDates
à l'aide de NSCalendar
objet, voici le code:
NSCalendar *calendar = [NSCalendar currentCalendar];
NSUInteger unitFlags = NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit;
NSDateComponents *components = [calendar components:unitFlags fromDate:nowDate toDate:endDate options:0];
et components.hour
me montre +3 heures de différence
Montrer le code de la façon dont vous avez obtenu
à des fins de test, vous pouvez configurer votre changer le fuseau horaire de votre mac à londres pour le voir, que la différence sera parti (ou peut-être 1 en raison de l'heure d'été) dans votre simulateur
nowDate
et endDate
à des fins de test, vous pouvez configurer votre changer le fuseau horaire de votre mac à londres pour le voir, que la différence sera parti (ou peut-être 1 en raison de l'heure d'été) dans votre simulateur
OriginalL'auteur Timur Mustafaev | 2012-07-12
Vous devez vous connecter pour publier un commentaire.
NSDates sont toujours stockés dans l'UTC, en fait les dates itselfs ne savez rien sur les fuseaux horaires ou des semaines, des mois, des années. Ils sont juste un point dans le temps.
Pour voir l'heure correcte de votre position sur la surface de la terre, vous avez besoin de prendre le NSCalendar, qui représente votre modèle de temps en compte. Vous pouvez l'utiliser directement et mess avec vos dates, ou de créer un NSDateFormatter qui laissera les dates intacte mais d'ajuster leur apparence à vos besoins.
résultats dans
en réponse au commentaire de:
essayer ce code, à l'essai de
vous vous rendrez compte, que le début de la journée, la semaine, le mois et l'année sera ajusté à votre heure locale, que le premier de chaque NSLog-paire sera de vous donner la date de l'UTC et la seconde dans votre fuseau horaire local.
sur le chat que vous avez posté ce code
donc, le problème, c'est que les datestring est en fait pas de GMT, mais OTTE (Eastern European Time)
essayer
mais de loin la plus élégante solution serait d'obtenir la datestring avec le décalage UTC, semblable à
2012-07-12 12:23:00 +0300
si possible.Dans un tel cas, vous pouvez analyser avec
[dateFormat setDateFormat:@"yyyy-mm-dd HH:mm:ss Z"];
et n'ont pas besoin de plus de temps de la zone de manipulation, comme le formateur sait le décalage par l'
Z
spécificateur.Notez également que si vous n'avez pas de définir le fuseau horaire, l'appareil doit être utilisé. Si l'utilisateur est toujours dans le même fuseau horaire que le temps à partir de la date de chaîne, cela devrait fonctionner, trop. Mais si l'utilisateur quitte la zone, ou vous imé d'avoir de travail dans le monde entier, vous devez utiliser l'une des solutions que je vous ai donné. Avec la deuxième (en précisant le fuseau horaire dans la datestring) préféré.
Votre nsdate objets tout fonctionne bien.
Mais ils me donnent mal de temps, quand je reçois des composants.heure de NSDateComponents 🙂
voir mon test de code que j'ai posté.
non, désolé, je dois y aller. s'il vous plaît ajouter la date de création de codes à vos questions, comme je le pense, qu'ils sont créés dans différents fuseaux horaires.
OriginalL'auteur vikingosegundo
La date probablement a la bonne valeur; peut-être que vous pensez que c'est faux parce qu'il vous semble incorrect lorsque vous vous connectez? C'est parce que lorsque vous vous connectez, il affiche la date au format UTC. Vous pouvez obtenir la chaîne de caractères dans votre fuseau horaire local par à l'aide d'un NSDateFormatter.
S'il vous plaît, regardez Édité code, que pouvez-vous dire maintenant? Le problème n'est-il pas l'appareil ou de simulateur
Eh bien, ce sont nowDate et la date de fin?
Maintenant date:(18:04) par mon temps, et l'heure de Fin est 2012-08-15 00:00
OriginalL'auteur Jesse Rusak
La réponse est correcte si la deuxième date est au format UTC. L'Ukraine est actuellement de 3 heures à l'avance de l'heure UTC, afin de minuit UTC à 21:00 en Ukraine. 21:00 - 18:00 est de 3 heures. Afin de vérifier la façon dont vous êtes l'obtention de la deuxième date. Le mauvais temps de la zone est sans doute d'être précisé.
Si la première date était vraiment créé à 18:00 Ukraine temps via
puis la deuxième date est vraiment 21:00 Ukraine temps qui correspond à minuit UTC. Puisque vous prétendez qu'il est minuit, vous devez avoir utilisé UTC créer à partir d'une chaîne, que ce soit implicitement ou explicitement. Montrez-nous comment vous l'avez créé.
** EDIT **
Le code que vous m'avez donné sur le chat est ceci:
La troisième ligne définit le fuseau horaire de GMT qui est identique à l'UTC pour toutes fins utiles. Votre date de formateur est probablement initialisé avec les paramètres régionaux appropriés pour l'appareil, et donc, probablement, vous pouvez simplement laisser cette ligne.
n'ont pas de temps horaires. Ils sont toujours en UTC, donc quand vous l'avez créé, à partir d'une chaîne de dire que vous spécifié UTC ou implicitement spécifié UTC.
Deuxième jour, j'ai reçu de NSString à l'aide de NSDateFormatter, s'il vous plaît, laisse parler ici chat.stackoverflow.com/rooms/13796/... , je vais vous montrer le code
OriginalL'auteur JeremyP