我有这段代码:
NSDate *now = [NSDate date];
static NSDateFormatter *dateFormatter;
if (!dateFormatter) {
dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"h:mm:ss";
}
recordStatusLabel.text = [dateFormatter stringFromDate:now];
NSLog(@"Time now: %@", [dateFormatter stringFromDate:now]);
计算当前时间。如何将其更改为以此格式启动?
00:00:00(小时:分钟:秒)
来自NSString
变量:
示例:我的变量
得到了这个值NSString * time = @"02:16:23";
然后计数器将继续计数: 2时16分24秒 。 。 。 2点20分13秒
答案 0 :(得分:4)
创建NSTimer
类的实例,并使用重复选项YES
为事件触发设置1秒的时间。在事件处理中,使用当前时间更新标签。当您的功能完成后,使计时器无效以停止触发事件。
以下是创建NSTimer
类实例的代码:
NSTimer *countUpTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self
selector:@selector(countUpTimerFired:) userInfo:nil repeats:YES];
以下是事件处理的方法:
- (void)countUpTimerFired:(id)sender {
dispatch_async(dispatch_get_main_queue(), ^{
recordStatusLabel.text = [dateFormatter stringFromDate:[NSDate date]];
});
}
保留dateFormatter
和countUpTimer
作为类变量。
当您从当前设备时间开始计时时,这是实现所需功能的简单方法;所以你不需要额外的努力从标签中获取价值,递增价值然后转换回字符串。
修改强>
如果要从任何其他时间值或字符串启动计数器,可以保留一个整数变量以保持时间值(以秒为单位)。然后在调用timer事件时(每秒)递增值,然后将该整数转换为时间字符串。
这里是初始值的代码:
NSString *timeString = recordStatusLabel.text; //contains a string in time format like @"2:16:23" or @"00:00:00" or current time or any other value.
NSArray *timeComponents = [timeString componentsSeparatedByString:@":"];
int timeInSeconds = [timeComponents[0] intValue]*3600 + [timeComponents[1] intValue]*60 + [timeComponents[2] intValue];
在处理计时器的事件中:
- (void)countUpTimerFired:(id)sender {
timeInSeconds++;
int hours = timeInSeconds/3600;
int minutes = (timeInSeconds%3600)/60;
int seconds = timeInSeconds%60;
dispatch_async(dispatch_get_main_queue(), ^{
[recordStatusLabel setText:[NSString stringWithFormat:@"%d:%02d:%02d", hours, minutes, seconds]];
});
}
答案 1 :(得分:1)
由于您正在处理最快值为秒的计时器,因此为了达到性能,您只需触发一个每秒重复一次的计时器。
@implementation Yourclass {
NSDate *startDate;
NSTimer *yourTimer;
NSString *myTime;
}
-(IBAction)startTimer:(id)sender {
startDate = [NSDate date];
yourTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timeHandler:) userInfo:nil repeats:YES];
[yourTimer fire];
}
-(void)timeHandler:(NSTimer *)myTimer {
//Difference between dates in seconds
NSTimeInterval elapsedTime = [startDate timeIntervalSinceNow];
//Divide by 3600 to get the hours
NSInteger hours = elapsedTime/3600;
//Divide by 60 to get the minutes
NSInteger minutes = elapsedTime/60;
NSInteger seconds = elapsedTime;
myTime = [NSString stringWithFormat:@"%i:%i:%i",hours, minutes, seconds];
// update the label
recordStatusLabel.text = myTime;
}