我有这个命令在后台模式中每秒调用一次,每次调用它时我都会为我的float类型变量添加+1,并转换为日期格式:
xis = (xis + 1) / 000001;
//The Format which you want as output
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
dateFormat.dateFormat = @"ss:mm:hh";
[dateFormat setTimeZone:[NSTimeZone systemTimeZone]];
//The Format in which your dateTime currently is
NSDateFormatter *dateFormat1 = [[NSDateFormatter alloc] init];
dateFormat1.dateFormat = @"hh.mm";
[dateFormat1 setTimeZone:[NSTimeZone systemTimeZone]];
NSString *timeStr = [NSString stringWithFormat:@"%.2f",xis];
NSDate *dates = [dateFormat1 dateFromString:timeStr];
NSLog(@"Time: %@", [dateFormat stringFromDate:dates]);
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
recordTime.text = [NSString stringWithFormat:@"%@",[dateFormat stringFromDate:dates]];
}];
但是当时间到了00:00:12时,这个代码有问题,出现了问题,时间是值(null),这可能导致了这个问题,我该如何解决呢?
答案 0 :(得分:2)
有两个问题:
我建议不要使用NSTimer
例程来自己跟踪已用时间。可能无法使用您期望的频率调用定时器。此外,如果用户暂停了应用程序并返回该应用程序,那么当应用程序不再位于前台时,您实际上并不想尝试保持此计时器继续运行。简而言之,您希望将UI的更新与经过时间字符串表示的计算分离。
因此,应该捕获“开始时间”,然后让例程获取当前时间,将其与“开始时间”进行比较,并计算该经过时间的字符串表示。但值得注意的是,经过几秒钟的变量没有增加,而是应该依赖于设备的系统时间。
您的格式问题源于数字计数器到日期字符串的尴尬转换。由于向后的格式化字符串ss:mm:hh
。
首先(以及我的上述观点),我可能会通过预先捕获开始时间并将其存储在CFAbsoluteTime
属性中来计算经过的时间(以秒为单位):
self.start = CFAbsoluteTimeGetCurrent();
而且,如果您真的想使用NSDateFormatter
,而不是使用它来解释数值,我只会用它来转换NSDate
个对象。例如,您可以获取NSDate
的{{1}},使用00:00:00
将已用时间添加到日期,然后使用格式化程序获取输出字符串:
dateByAddingTimeInterval
话虽如此,我可能会赞成两种不同的方法。一种是手动计算小时,分钟和秒:
// calculate the time elapsed in seconds
CFTimeInterval elapsed = CFAbsoluteTimeGetCurrent() - self.start;
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"HH:mm:ss";
NSDate *start = [formatter dateFromString:@"00:00:00"];
NSDate *end = [start dateByAddingTimeInterval:elapsed];
NSString *elapsedString = [formatter stringFromDate:end];
或者完全不同的方法是使用// calculate the time elapsed in seconds
CFTimeInterval elapsed = CFAbsoluteTimeGetCurrent() - self.start;
// convert this to hours, minutes, and seconds
double seconds;
double minutes;
double hours;
seconds = modf(elapsed / 60.0, &minutes) * 60.0;
minutes = modf(minutes / 60.0, &hours) * 60.0;
// create format string
NSString *elapsedString = [NSString stringWithFormat:@"%02.0f:%02.0f:%04.1f", hours, minutes, seconds];
。在这种情况下,可能有一个NSCalendar
属性,您可以使用开始时间进行初始化:
NSDate
然后你可以做类似的事情:
self.startDate = [NSDate date];
只是几种方法。但我建议不要手动递增你的计数器,我可能会建议使用后一种技术。