Objective c 比较NSDate对象

Objective c 比较NSDate对象,objective-c,unit-testing,core-data,nsdate,Objective C,Unit Testing,Core Data,Nsdate,我有一个使用CoreData的应用程序。其中一个实体包含date属性,即。。。约会。我正在编写一个测试,以检查传递给该实体的类的class方法的时间戳是否正在转换为正确的NSDate 以下是我的测试代码: NSDate *now = [NSDate date]; NSTimeInterval ts = [now timeIntervalSince1970]; // paramDict is a dictionary with attributes and values [paramDict se

我有一个使用CoreData的应用程序。其中一个实体包含
date
属性,即。。。约会。我正在编写一个测试,以检查传递给该实体的类的class方法的时间戳是否正在转换为正确的
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];

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

您可以使用

并将结果与阈值进行比较(例如,1秒)。如果差值小于1秒,则考虑两个日期相同。

根据NSDate(isEqualToDate)的文件:

此方法检测日期之间的秒级差异。如果要比较粒度较小的日期,请使用timeIntervalSinceDate:比较这两个日期


对不起,但这看起来像是黑客攻击。我还假设
isEqualToDate:
方法的存在是有原因的。只是不确定如果我从另一个日期生成的时间戳实例化一个日期会发生什么。我认为这与双浮点精度有关,正如你在问题中提到的。可能是
dateWithTimeIntervalSince1970:
方法在内部转换给定的时间间隔,这可能会导致精度损失。您是否尝试改用
datewithtimeintervalcescereferencedate:
?根据文档,它“为NSDate接口中的所有其他方法提供了基础”,并且可能不需要在内部重新计算间隔。“浮点数学不精确”。您不应该尝试比较浮点数是否相等。
NSTimeInterval difference = fabs([[myEntity date] timeIntervalSinceDate:now]);