我有一个在后台模式下每秒被调用的命令,每次被调用时,我将+1添加到我的float类型的变量中,并转换为日期格式:
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),这可能是造成这种情况的原因,我该如何解决?
有两个问题:
我建议您不要使用NSTimer
例程来跟踪经过的时间。可能不会以您期望的频率调用计时器。另外,如果用户暂停了该应用程序并返回到该应用程序,则您真的不想在应用程序不再处于前台时尝试使此计时器继续运行。简而言之,您希望将UI的更新与经过的时间字符串表示形式的计算脱钩。
因此,相反,应该捕获“开始时间”,然后让例程获取当前时间,将其与“开始时间”进行比较,并计算该经过时间的字符串表示形式。但值得注意的是,变量不会在经过几秒钟后增加,而应该依赖于设备的系统时间。
您的格式设置问题源于数字计数器到日期字符串的笨拙转换。由于格式字符串向后倒退,使问题变得复杂ss:mm:hh
。
首先(和我上面提到的一样),我可能会通过捕获开始时间并将其存储在CFAbsoluteTime
属性中来计算经过的时间(以秒为单位):
self.start = CFAbsoluteTimeGetCurrent();
而且,如果您真的想使用NSDateFormatter
,而不是使用它来解释数字值,我只会将其用于与NSDate
对象之间的转换。例如,您可以获取NSDate
for 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];
然后您可以执行以下操作:
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *now = [NSDate date];
NSDateComponents *components = [calendar components:NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond fromDate:self.startDate toDate:now options:0];
NSString *elapsedString = [NSString stringWithFormat:@"%02ld:%02ld:%02ld", (long)components.hour, (long)components.minute, (long)components.second];
只是几种方法。但我建议您不要手动手动增加计数器,我可能会建议您使用后一种技术。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句