Ios 日期和时间间隔
我正在努力理解如何正确使用NSDates 我有一个实例化Ios 日期和时间间隔,ios,nsdate,nstimeinterval,Ios,Nsdate,Nstimeinterval,我正在努力理解如何正确使用NSDates 我有一个实例化timingDate=[NSDate]的事件 随后,我将讨论如何记录用户触摸之间的时间间隔。 所以我想找出计时日期和用户触摸之间的间隔,以毫秒为单位。 然后我想将计时日期重置为等于触摸时间,以便下次触摸屏幕时,我可以找到上一次触摸和当前触摸之间的差异。我希望这是有道理的。但我在兜圈子,因为我不知道如何使用NSDates或nsinterval。属性interval touchTime和timingDate当前都是NSDate类型-对吗 所以我
timingDate=[NSDate]的事件代码>
随后,我将讨论如何记录用户触摸之间的时间间隔。
所以我想找出计时日期和用户触摸之间的间隔,以毫秒为单位。
然后我想将计时日期重置为等于触摸时间,以便下次触摸屏幕时,我可以找到上一次触摸和当前触摸之间的差异。我希望这是有道理的。但我在兜圈子,因为我不知道如何使用NSDates或nsinterval。属性interval touchTime和timingDate当前都是NSDate类型-对吗
所以我试过很多不同的方法,比如
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
touchTime = timingDate;
interval = [[NSDate date] timeIntervalSinceDate:timingDate]; // should be the time difference from when the timingDate was first set and when the user touched the screen.
touchTime = [[[NSDate date]timeIntervalSinceDate:timingDate]doubleValue];
timingDate = [NSDate dateWithTimeIntervalSinceReferenceDate:touchTime];
NSLog(@"Time taken Later: %f", [[NSDate date]timeIntervalSinceDate:timingDate]);
}
NSTimeInterval
是一个表示秒的双精度字符
NSDate
是保存日期/时间的对象
以下是一个例子:
@property(nonatomic, strong) NSDate * lastTouchDate;
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSTimeInterval secondsSinceLastTouch = 0;
if(self.lastTouchDate){
secondsSinceLastTouch = [[NSDate date] timeIntervalSinceDate:self.lastTouchDate];
NSLog(@"It's been %.1f seconds since the user touched the screen", secondsSinceLastTouch);
}else{
NSLog(@"This is the first time the user touched the screen");
}
self.lastTouchDate = [NSDate date];
}
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:timingDate];
NSLog(@"Time taken: %f seconds / %f milliseconds",timeInterval,timeInterval*1000);
如果您不想要上次触摸它之间的时间间隔,请不要在初始化后更新self.lastTouchDate,它将是自初始化日期起的秒数 您的代码有点复杂!您只需计算timingDate
与触摸发生时间之间的差值,然后将timingDate
设置为当前时间,以便可以对每个触摸事件执行此计算
要查找timingDate
与第一次触摸之间的差异,您可以使用NSDate的TIMEINTERVALICENCEDATE
和当前时间。这将返回一个NSTimeInterval值,该值以秒为单位表示时间值,精度为亚毫秒。下面是一个例子:
@property(nonatomic, strong) NSDate * lastTouchDate;
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSTimeInterval secondsSinceLastTouch = 0;
if(self.lastTouchDate){
secondsSinceLastTouch = [[NSDate date] timeIntervalSinceDate:self.lastTouchDate];
NSLog(@"It's been %.1f seconds since the user touched the screen", secondsSinceLastTouch);
}else{
NSLog(@"This is the first time the user touched the screen");
}
self.lastTouchDate = [NSDate date];
}
NSDate *currentDate = [NSDate date];
NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:timingDate];
NSLog(@"Time taken: %f seconds / %f milliseconds",timeInterval,timeInterval*1000);
然后,为了将计时日期设置为当前时间,只需使用timingDate=currentDate代码>。这将允许您连续测量触摸之间的时间差。因此,您需要了解的第一件事是-[NSDate timeintervalencesincedate:
返回一个NSTimeInterval
,它实际上只是一个双倍值
在上面的示例中,您没有使用类型声明变量,但是如果您查看变量interval
的值,它应该是自timingDate
表示的时间起秒的十进制值
假设timingDate
是一个NSDate
对象,并且它是在运行此代码之前设置的,则此代码应将时间(秒)打印到调试控制台
NSTimeInterval interval = [[NSDate date] timeIntervalSinceDate:timingDate];
NSLog(@"Time between touches %f", interval);
这是NSDate类文档,以防您在查找时遇到困难。
()timeIntervalSinceDate
返回一个NSInterval
,它不是一个对象类型,而是一个简单的数字类型。它确实是double
,因此要从NSInterval
转换为double
您只需使用(double)
(而不是doubleValue
)进行转换。实际上,这就是NSTimeInterval文档。NSDate在D'oh!谢谢你的热情款待。我会更正上面的链接。当然-我不知道为什么我没有像你建议的那样重新设置计时日期。谢谢你的帮助。一些建议:1)不要打两次电话给[NSDate]
。你最终会有两个不同的日期,随着时间的推移,事情并没有完全累加起来。2) 而不是使用[NSDate]
。从实际事件获取时间戳<代码>NSTimeInterval touchTimestamp=[[触摸任何对象]时间戳]
@rmaddy很好,我已经编辑了代码,所以[NSDate]只被调用一次。Re:UITouch timestamp,这可以用来计算触摸之间的时间差,但是我认为在第一次触摸时,OP需要计算与其他地方设置的NSDate日期之间的差异。我的观点是[NSDate date]
为您提供运行代码的时间戳,同时获取触摸的时间戳来自用户实际触摸屏幕的时间戳。当然,两者之间的差别很小。@rmaddy是的,我理解,但OP指出第一个timingDate
值不是来自触摸事件,而是在其他时间点作为NSDate对象实例化的[NSDate date]
不能以任何简单的方式与[UITouch timestamp]
进行比较,对吗?