NSDate - Compensation le fuseau Horaire
Je doit manquer un petit quelque chose, mais ne peut pas le comprendre. En essayant de créer une date pour la comparaison, mais je n'arrive pas à compenser currentDate de GMT à l'est:
//current date (gmt) //
NSDate *currentDate = [NSDate date];
NSTimeZone *currentDateTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"EST"];
NSDateFormatter *currentDateFormat = [[NSDateFormatter alloc]init];
[currentDateFormat setTimeZone:currentDateTimeZone];
[currentDateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss zzz"];
NSString *currentDateString = [currentDateFormat stringFromDate:currentDate];
NSLog(@"currentDateString: %@", currentDateString); //returns 2011-01-05 13:30:30 EST
NSDate *currentDateWithOffset = [currentDateFormat dateFromString:currentDateString];
NSLog(@"currentDateWithOffset: %@", currentDateWithOffset); //returns 2011-01-05 18:30:30 +0000
Merci!
Edit:
Je suis d'appeler une méthode dans une classe à part (en essayant de faire de ce portable) à l'aide de la ligne suivante:
[Expiration expires:[[NSDate alloc] initWithString:@"2011-01-07 12:00:00 +0000"] within:1.0]
à l'expiration de la méthode, j'ai ces lignes:
NSComparisonResult comparison = [currentDateWithOffset compare:expires]; //check for a fixed date to disable the demo
double withinRange = [installDate timeIntervalSinceDate:currentDateWithOffset]; //check for number of seconds between "within" and the install date
Je suis ensuite comparer ces deux valeurs comme:
if(withinRange >= within && withinRange > 0.0) {
//app is expired //
}
else {
//app is still enabled (so far...) //
if(comparison == NSOrderedDescending || comparison == NSOrderedSame) {
//app is expired //
}
else {
//app is still enabled //
}
}
Cela vous aide? Merci pour votre patience!
Edit:
Voici l'intégralité de la date d'expiration:à l'intérieur de la méthode tel qu'il est actuellement...
+(BOOL)expire:(NSDate*)expires within:(double)within {
//default expired value //
BOOL expired = NO;
//convert within value from days to seconds //
within *= 24.0 * 60.0 * 60.0;
//current date (gmt) //
NSDate *currentDate = [NSDate date];
//install date //
NSDate *installDate = [[NSUserDefaults standardUserDefaults]objectForKey:@"installDate"];
//check for a value in installDate //
if (nil == installDate) {
//app is running for the first time //
[[NSUserDefaults standardUserDefaults]setObject:currentDate forKey:@"installDate"];
[[NSUserDefaults standardUserDefaults]synchronize];
installDate = currentDate;
}
if([installDate timeIntervalSinceNow] < (-within)) {
expired = YES;
}
else {
if([expires timeIntervalSinceNow] < 0) {
expired = YES;
}
}
NSLog(@"installDate:%@", installDate);
NSLog(@"expires:%@", expires);
NSLog(@"currentDate:%@", currentDate);
return expired;
}
Je suis ensuite appeler à partir d'une autre classe avec
message.text = (YES == [Expiration expire:[[NSDate alloc] initWithString:@"2011-01-07 12:00:00 -0500"] within:(0.015625/2)]) ? @"This App is Expired" : @"This App is Active";
Lors de l'exécution dans le simulateur (frais app installer), NSLog affiché ce...
[Session started at 2011-01-06 10:43:46 -0500.]
2011-01-06 10:43:48.146 TimeBasedDemo[14717:207] installDate:2011-01-06 15:43:48 +0000
2011-01-06 10:43:48.147 TimeBasedDemo[14717:207] expires:2011-01-07 17:00:00 +0000
2011-01-06 10:43:48.147 TimeBasedDemo[14717:207] currentDate:2011-01-06 15:43:48 +0000
Je suis en train de comparer la date/heure actuelle à l'encontre fourni de date/heure pour le temps limité de démonstration des applications. La partie qui me tracas est de faire la comparaison dans mon fuseau horaire (heure de l'est) plutôt que l'heure GMT. Plus facile à utiliser mon propre fuseau horaire que de convertir GMT lorsque j'appelle la méthode.
Ce code ressemble exactement à droite, et ainsi de la sortie. Je devine que votre problème est que vous vous attendiez à voir
10:43:48 -0500
dans le journal plutôt que de 15:43:48 +0000
. La chose est - elle est OK. Ils sont en même temps. C'est juste la façon dont il affiche lorsque vous appelez NSLog.Bon, je me sens comme un idiot réelle maintenant... NSLog est l'impression expire GMT APRÈS l'application de l'offset de -0500. Je m'attendais à le voir comme 07:00:00. Je crois que je comprends maintenant. Merci à tous pour votre aide. Maintenant j'ai juste besoin de comprendre comment l'obtenir pour appeler cette méthode à chaque fois que l'app est utilisée. Merci encore!
Vous l'avez! 😀
OriginalL'auteur Eric | 2011-01-05
Vous devez vous connecter pour publier un commentaire.
Un
NSDate
objet représente un instantané dans le temps quel que soit le fuseau horaire et le calendrier des considérations. Fuseau horaire info est pertinente lorsque vous imprimez ou analyser une date, mais il n'est pas stocké dans laNSDate
.Dire que vous êtes la création de votre date d'expiration comme ceci:
Qui dit que vous voulez l'expiration d'un délai pour se produire à midi GMT, le 7 Janv. Si vous voulez qu'il expire à midi (HNE), le créer avec -0500 à la place. Ce que vous devez pas avez à faire est de désordre à l'heure actuelle, lorsque vous faites une comparaison.
Un moyen facile juste pour voir si le temps a passé est alors
et vous pouvez voir si
within
de secondes qui se sont écoulées depuis la date d'installation comme ceci:Cool, j'ai mis à jour ma réponse
Merci, invariant! Qui a aidé à nettoyer (et clair) un peu les choses, merci. Malheureusement, je suis toujours avoir un problème avec la durée de la question de la zone. installDate est défini à l'aide de currentDate (NSDate *currentDate = [NSDate date];) donc, il y a toujours un décalage lors de la comparaison. Puisque le but est de réutiliser la classe sans le modifier, et pour permettre des décalages de fuseau horaire, est NSDate le chemin pour aller avec ça?
Je suis sûr que NSDate est la bonne façon de faire, je le fais de cette façon exacte de moi-même. Je pense que vous êtes l'incompréhension comment NSDate œuvres. Si vous enregistrez la date de l'installation à l'aide de
[NSDate date]
, les stocker, puis de le comparer plus tard, à nouveau avec[NSDate date]
(outimeIntervalSinceNow
), alors il sera toujours vous donner le temps écoulé entre les moments que ces méthodes ont été appelés. Fuseau horaire n'est pas facile d'y entrer, c'est juste une notation pour quand vous l'afficher ou de le stocker en tant que chaîne de caractères. Je fais la chose exacte que dans mon propre code avec pas de problèmes.Je suppose que je ne comprends toujours pas. J'ai édité ci-dessus pour afficher le code et les résultats de NSLog...
OriginalL'auteur Nick Moore
Aucune de ces réponses m'ont donné un
NSDate
objet du courant, de la date locale. Donc voici comment j'ai fait:OriginalL'auteur samvermette
Dans le Cacao,
NSDate
est une représentation abstraite d'une date avec un rien de temps des informations sur la zone appliquée. Notez quecurrentDateWithOffset
est la même date que la date de chaîne, juste dans un autre fuseau horaire (cinq heures à l'avance). Ce comportement est normal, commeNSDate
ne persiste pas le fuseau horaire utilisé pour le créer.OriginalL'auteur mipadi
J'ai bricolé un peu plus et trouvé un moyen de "tricher" le décalage en fonction de mes besoins. D'autres la lecture, je devine que NSCalendar peut-être un meilleur long terme de la solution, mais pour l'instant j'ai fini par changer de
à
Qui m'a obtenu les résultats que j'ai besoin et travaille dans les comparaisons ultérieures que j'utilise. Merci pour l'info de base tous les!
Je vais essayer de comprendre comment le faire.
OriginalL'auteur Eric