Je dois manquer quelque chose de petite mais je n'arrive pas à comprendre. Essayer de créer une date de comparaison, mais je ne peux pas sembler compenser currentDate de GMT à EST:NSDate - Décalage du fuseau horaire
// 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:
J'appelle une méthode dans une classe séparée (en essayant de faire ce portable) en utilisant la ligne suivante:
[Expiration expires:[[NSDate alloc] initWithString:@"2011-01-07 12:00:00 +0000"] within:1.0]
dans la méthode arrive à expiration, 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 puis on compare ces deux valeurs comme ceci:
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 //
}
}
Est-ce que cela aide? Merci pour votre patience!
Edit:
est ici l'ensemble arrive à expiration: au sein de la méthode telle qu'elle 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 puis l'appeler 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 (installation d'application fraîche), NSLog a 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
Pouvez-vous être plus précis sur ce que vous voulez vraiment faire? –
J'essaie de comparer la date et l'heure actuelles avec une date/heure fournie pour les applications de démonstration limitées dans le temps. La partie qui me donne la peine de faire la comparaison dans mon fuseau horaire (EST) plutôt que GMT. Plus facile d'utiliser mon propre fuseau horaire que de convertir en GMT lorsque j'appelle la méthode contenant. – Eric
Ce code semble parfaitement correct, tout comme la sortie. Je suppose que votre problème est que vous vous attendiez à voir '10:43:48 -0500' dans le journal plutôt que' 15:43:48 + 0000'. La chose est - c'est OK. Ils sont * en même temps *. C'est exactement comme cela que vous imprimez lorsque vous appelez NSLog. –