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
Pouvez-vous être plus précis sur ce que vous voulez vraiment faire?
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