Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 日期和时间间隔_Ios_Nsdate_Nstimeinterval - Fatal编程技术网

Ios 日期和时间间隔

Ios 日期和时间间隔,ios,nsdate,nstimeinterval,Ios,Nsdate,Nstimeinterval,我正在努力理解如何正确使用NSDates 我有一个实例化timingDate=[NSDate]的事件 随后,我将讨论如何记录用户触摸之间的时间间隔。 所以我想找出计时日期和用户触摸之间的间隔,以毫秒为单位。 然后我想将计时日期重置为等于触摸时间,以便下次触摸屏幕时,我可以找到上一次触摸和当前触摸之间的差异。我希望这是有道理的。但我在兜圈子,因为我不知道如何使用NSDates或nsinterval。属性interval touchTime和timingDate当前都是NSDate类型-对吗 所以我

我正在努力理解如何正确使用NSDates

我有一个实例化
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]
进行比较,对吗?