2009-11-06 3 views
0

J'ai créé une application.In l'application je démarre un compte à rebours et enregistrer la date actuelle comme double valeur dans la base de données aussi enregistrer la date de fin selon compte à rebours .Après la fermeture et retour à l'application je reçois la différence date actuelle et date de début et régler le compte à rebours en fonction de cela. mais un problème survient lorsque je change l'heure 8 heures à l'avance, puis le compte à rebours se comporte différemment.Comment je trouve cet utilisateur a changé d'heure ou de fuseau horaire? par le si je change de fuseau horaire supposez new delhi à usa cela fonctionne bien mais dans le même fuseau horaire si j'augmente/diminue la date ou l'heure il ne se comporte pas comme prévu. Comment puis-je gérer ceci?comment trouver cet utilisateur a changé l'heure dans iphone sdk?

J'avais aussi vu un étrange problème lorsque la date d'augmentation/diminution ou le temps l'application se ferme dès qu'il launched.i suis incapable de le comprendre

Répondre

3

Pour votre minuterie pour être exact, vous devez simplement utiliser la date de fin. Je ne sais pas pourquoi vous voulez garder la date de début.

Voici un exemple avec un compte à rebours continue:

// I'm assuming you want to update the countdown every seconds 
// So you should set a timer like this somewhere 
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerTick) userInfo:nil repeats:YES]; 

- (void)updateCountdown { 
    NSTimeInterval timeInterval = [endDate timeIntervalSinceNow]; 

    unsigned int d, h, m, s; 
    NSTimeInterval r; 

    d = timeInterval/(24 * 3600); 
    r = timeInterval - d * 24 * 3600; 

    h = r/3600; 
    r = r - h * 3600; 

    m = r/60; 
    r = r - m * 60; 

    s = r; 

    NSString *countdown = [NSString stringWithFormat:@"%.2d:%.2d:%.2d:%.2d", d, h, m, s]; 
    // Now you could use countdown to update the text of a UILabel 
} 

- (void)timerTick { 
    if ([endDate compare:[NSDate date]] == NSOrderedDescending) { 
     //endDate is later in time than "now", ie not yet reached 
     [self updateCountdown]; 
    } else { 
     //stop the countdown 
     [timer invalidate]; 
    } 
} 

endDate devrait être un NSDate contenant la date à laquelle le compte à rebours devrait atteindre 0.

Parce que le compte à rebours est réglé toutes les secondes, vous ne serez pas avoir des problèmes même si l'heure du système ou le fuseau horaire change. Cependant, assurez-vous de sauvegarder et de restaurer endDate correctement lors du redémarrage/de la fermeture de l'application (par exemple, utilisez toujours une référence fixe!): J'utiliserais timeIntervalSinceReferenceDate et dateWithTimeIntervalSinceReferenceDate: de la classe NSDate).

0

Si vous êtes simplement intéressé à avoir un tir de la minuterie une fois à endDate utiliser quelque chose comme ceci:

NSTimer* timer = [[NSTimer alloc] initWithFireDate:endDate 
              interval:0.0f 
              target:self 
              selector:@selector(endDateReached:) 
              userInfo:nil 
              repeats:NO]; 
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 
[timer release]; 
0

Je ne sais pas comment vous pouvez vous déplacer à l'utilisateur de changer le temps pendant que votre application n » t en cours d'exécution. Mais je ne pense pas que vous ayez besoin de stocker le startDate ou la durée du timer. Ce que vous pouvez faire est de stocker endDate dans la base de données. Je voudrais essayer de le stocker dans un fuseau horaire agnostique, comme GMT.

Ensuite, au prochain démarrage de votre application, prenez les dates stockées dans votre base de données et restaurez-les à l'heure locale. Obtenez également l'heure actuelle de la classe NSDate lorsque votre application est démarrée. L'heure actuelle peut ensuite être soustraite de la valeur endDate convertie pour calculer la durée du timer.

Ceci devrait permettre à l'utilisateur de changer son fuseau horaire et déclencher des événements au moment opportun. Vous auriez également moins à stocker dans votre base de données.

+0

Je fais exactement ce que vous dites.Je st stockage date de fin en DB et lors de la relance je reçois l'heure locale.Mais quand obtenir l'heure actuelle de classe nsdate si je change le temps 2 heures en arrière le nsdate actuel retournera mal time.so cette différence entre la date de fin et la date actuelle n'est pas comme prévu.qu'est-ce que le proble.how est-ce que je surmonte ce problème –