2011-11-17 153 views
1

我有一个使用CoreData的应用程序。其中一个实体包含date属性,这是一个日期。我正在编写一个测试,以检查传递给该实体类的类方法的时间戳是否正在转换为正确的NSDate比较NSDate对象

这里是我的测试代码:

NSDate *now = [NSDate date]; 
NSTimeInterval ts = [now timeIntervalSince1970]; 
// paramDict is a dictionary with attributes and values 
[paramDict setValue:[NSNumber numberWithDouble:ts] forKey:@"date"]; 

MyEntity *myEntity = [MyEntity entityWithAttributes:paramDict inContext:testMOContext]; 

STAssertTrue([now isEqualToDate:[myEntity date]], @"dates were not equal"); 

这仅仅是用来检查是否所有参数都正确设置整个测试的一个片段。但有趣的是,日期断言检查随机失败。我认为失败与双精度浮点数的丢失有关?我应该如何在这种情况下检查日期?

更新

的时间戳转换为日期的方法是这样的:

NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[paramDict valueForKey:@"date"] doubleValue]]; 
[newObject setDate:date]; 
+0

“浮点数学不准确”[详细信息](http://www.cygnus-software.com/papers/comparingfloats/comparingfloats.htm)。您不应该尝试比较浮点数是否相等。 – progrmr

回答

3

可以使用

NSTimeInterval difference = fabs([[myEntity date] timeIntervalSinceDate:now]); 

计算你现在日期和myEntity所日期之间的差异,其结果与阈值(1秒,例如)。如果差异小于1秒,则认为两个日期相同。

从的NSDate(isEqualToDate)的文档:

这种方法检测的日期之间的子第二差异。如果您想比较不太精细的日期,请使用timeIntervalSinceDate:比较两个日期。

+0

对不起,但它似乎是一个黑客。我也认为'isEqualToDate:'方法是有原因的。只是不确定如果我从由另一个日期生成的时间戳实例化日期会发生什么。 – Eimantas

+0

我认为它与双浮动精度有关,正如你在你的问题中提到的那样。也许'dateWithTimeIntervalSince1970:'方法会在内部转换给定的时间间隔,这可能会导致精度损失。你是否尝试过使用'dateWithTimeIntervalSinceReferenceDate:'而不是?根据文档,它“为NSDate接口中的所有其他方法提供了基础”,并且可能不需要在内部重新计算时间间隔。 – chrisklaussner

0

isEqualToDate比较NSDate对象,但你date属性似乎是一个时间间隔?我建议使用该属性的日期类型,并坚持使用NSDate

+0

感谢您的回应,请参阅最新的问题/ – Eimantas