iOS倒计时器到特定日期

use*_*452 2 nsdate nstimer countdown ios

我正在尝试将倒计时器定时到特定日期.我用:

-(void) viewWillAppear:(BOOL)animated {

    NSString *str =@"12/27/2013";
    NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
    [formatter setDateFormat:@"MM/dd/yyyy"];
    NSDate *date = [formatter dateFromString:str];

    NSTimeInterval numberOfSecondsUntilSelectedDate = [date timeIntervalSinceNow];
    NSInteger numberOfDays = numberOfSecondsUntilSelectedDate / 86400;


    startTime = [[NSDate date] retain];

    secondsLeft = numberOfDays;
    NSLog(@"number%f", numberOfSecondsUntilSelectedDate);
    [self countdownTimer];

}
- (void)updateCounter:(NSTimer *)theTimer {
    if(secondsLeft > 0 ){
        secondsLeft -- ;
        days = secondsLeft / 86400;
        NSLog(@"%d", days);
        hours = secondsLeft / 3600;
        minutes = (secondsLeft % 3600) / 60;
        seconds = (secondsLeft %3600) % 60;
        myCounterLabel.text = [NSString stringWithFormat:@"%02d Days %02d Hours %02d Minutes %02d Seconds", days, hours, minutes, seconds];
    }
    else{
        secondsLeft = 16925;
    }
}

-(void)countdownTimer{

    secondsLeft = hours = minutes = seconds = 0;
    if([timer isValid])
    {
        [timer release];
    }
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES];
    [pool release];
}
Run Code Online (Sandbox Code Playgroud)

然而,这一天不断出现为0.我做错了什么?

dan*_*anh 8

倒计时到特定日期的方法是只启动一个计时器并询问每次触发该日期是否已经过去.第二个问题是如何计算UI之前的小时分钟秒.答案有NSDateFormatter - 绝对不是*60或*24数学.

@property (strong, nonatomic) NSDate *targetDate;

// compute targetDate as you have it

// ...
self.targetDate = [formatter dateFromString:str]

// start a timer
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES]; 

- (void)updateCounter:(NSTimer *)theTimer {

    NSDate *now = [NSDate date]; 
    // has the target time passed?
    if ([self.targetDate earlierDate:now] == self.targetDate) {
        [theTimer invalidate];
    } else {
        NSUInteger flags = NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
        NSDateComponents *components = [[NSCalendar currentCalendar] components:flags fromDate:now toDate:self.targetDate options:0];

        NSLog(@"there are %ld hours, %ld minutes and %ld seconds remaining", (long)[components hour], (long)[components minute], (long)[components second]);
    }
}
Run Code Online (Sandbox Code Playgroud)