简体   繁体   English

倒数计时器不准确

[英]Countdown Timer not accurate

I am counting down til midnight in my app. 我在我的应用程序中倒数到午夜。 The only problem is that the countdown timer is always off by 5 or more minutes. 唯一的问题是倒数计时器总是关闭5分钟或更长时间。 Its never truly close the the actual time left until midnight. 它永远不会真正关闭直到午夜的实际时间。 I did the math and am pretty sure it is correct, but maybe I am making a stupid mistake. 我做了数学计算,我很确定它是正确的,但也许我犯了一个愚蠢的错误。

-(void) timerRun
{
NSDateFormatter *formatterAmPm = [[NSDateFormatter alloc] init];
[formatterAmPm setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterAmPm setDateFormat:@"a"];

NSString *amPmString = [formatterAmPm stringFromDate:[NSDate date]];

secondsCount = secondsCount + 1;
int hours = ((12*3600)-(secondsCount))/3600;
int minutes = ((12*3600)-(secondsCount)-(hours*3600))/60;
int seconds = ((12*3600)-(secondsCount)-(hours*3600))%60;

NSString *timerOutput = [NSString stringWithFormat:@"%.2d:%.2d:%.2d", hours, minutes, seconds];
_countDownLabel.text = timerOutput;

if ((secondsCount == 0) && ([amPmString isEqualToString:@"AM"]))
{
    [_countdownTimer invalidate];
    _countdownTimer = nil;
    MainViewController *ViewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
    ViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self.navigationController pushViewController:ViewController animated:YES];
    self.sidePanelController.centerPanel = [[UINavigationController alloc] initWithRootViewController:[[MainViewController alloc] init]];

}
}

-(void) setTimer
{
NSDateFormatter *formatterHour = [[NSDateFormatter alloc] init];
[formatterHour setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterHour setDateFormat:@"HH"];

NSDateFormatter *formatterMinute = [[NSDateFormatter alloc] init];
[formatterMinute setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterMinute setDateFormat:@"mm"];

NSDateFormatter *formatterSecond = [[NSDateFormatter alloc] init];
[formatterSecond setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterSecond setDateFormat:@"ss"];

NSDateFormatter *formatterAmPm = [[NSDateFormatter alloc] init];
[formatterAmPm setTimeZone:[NSTimeZone timeZoneWithName:@"America/New_York"]];
[formatterAmPm setDateFormat:@"a"];

NSString *amPmString = [formatterAmPm stringFromDate:[NSDate date]];
NSString *hourString = [formatterHour stringFromDate:[NSDate date]];
NSString *minuteString = [formatterHour stringFromDate:[NSDate date]];
NSString *secondString = [formatterHour stringFromDate:[NSDate date]];

int hour = (([hourString intValue]) * 60 * 60);
int minute = (([minuteString intValue]) * 60);
int second = [secondString intValue];
if ([amPmString isEqualToString:@"PM"])
{
    stopTime = 12*60*60;
}
else
{
    stopTime = 24*60*60;
}

secondsCount = hour + minute + second;

secondsCount = secondsCount - stopTime;

_countdownTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self     selector:@selector(timerRun) userInfo:nil repeats:YES];
}

NSTimer is not precise, it will fire sometime around about its due time. NSTimer并不精确,它会在适当的时间周围发射。 This means you can't use it to count seconds as you are trying. 这意味着您不能在尝试时使用它来计算秒数。

Instead what you need to do is get the actual time in your timerRun method and use that to determine the number of seconds left. 相反,您需要做的是在timerRun方法中获取实际时间并使用它来确定剩余的秒数。 You are already calling [NSDate date] to obtain the AM/PM indication, just use it to also get the current time, and then do the calculation of the seconds left. 您已经调用[NSDate date]来获取AM / PM指示,只需使用它来获取当前时间,然后计算剩余的秒数。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM