iOS倒计时器到特定日期

时间:2013-12-13 05:27:47

标签: ios nsdate nstimer countdown

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

-(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];
}

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

2 个答案:

答案 0 :(得分: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]);
    }
}

答案 1 :(得分:0)

逻辑错误....

-(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 = numberOfSecondsUntilSelectedDate;
    NSLog(@"number%f", numberOfSecondsUntilSelectedDate);
    [self countdownTimer];

}