我已经创建了一个应用程序。在应用程序中我启动倒数计时器并将当前日期保存为数据库中的双倍值也根据倒数计时器保存结束日期。关闭并返回应用程序我得到时间表单数据库找到差异在当前日期和开始日期之间并根据它设置倒计时。但是当我提前8小时更改时间然后倒数计时器表现不同时会出现问题。我是否发现用户已更改时间或时区?如果我改变时区假设新德里到美国它工作正常,但在同一时区,如果我增加/减少日期或时间它没有按预期行事。我管理这个吗?
此外,当应用程序一旦启动就增加/减少日期或时间,我就看到了一个奇怪的问题。我无法弄清楚
答案 0 :(得分:3)
准确地说,你应该使用结束日期。我不确定你为什么要保留开始日期。
这是一个连续倒计时的例子:
// 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
应该是一个NSDate,其中包含倒计时应达到0的日期。
由于每秒都会调整倒计时,因此即使系统时间或时区发生变化也不会出现问题。
但是请确保在应用程序重新启动/关闭时正确保存和恢复endDate(即始终使用固定引用!我将使用timeIntervalSinceReferenceDate和dateWithTimeIntervalSinceReferenceDate:来自NSDate类)。
答案 1 :(得分:0)
如果您只想在endDate
点击一次计时器,请使用以下内容:
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];
答案 2 :(得分:0)
我不确定如何在应用程序未运行时绕过用户更改时间。但我认为您不需要存储startDate或计时器的持续时间。您可以做的是将endDate存储在数据库中。我会尝试以时区无关的方式存储它,比如GMT。
然后,下次启动应用程序时,请记录存储在数据库中的日期并将其转换回本地时间。还可以在启动应用程序时从NSDate类获取当前时间。然后可以从转换的endDate中减去当前时间以计算定时器持续时间。
这应该允许用户更改他们的时区并仍然在正确的时间触发事件。您在数据库中存储的内容也较少。