比较两个NSDate的日期/时间是否相同

15

date1 == date2”不是一种有效的比较方式吗?如果不是,正确的替代方法是什么?

这是我的代码:

- (NSDate*) dateWithNoTime {
    unsigned int flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
    NSCalendar* calendar = [NSCalendar currentCalendar];
    NSDateComponents* components = [calendar components:flags fromDate:self];
    NSDate* dateOnly = [calendar dateFromComponents:components];
    return dateOnly;
}

- (BOOL) sameDayAsDate:(NSDate*)dateToCompare {
    NSDate *date1 = [self dateWithNoTime];
    NSDate *date2 = [dateToCompare dateWithNoTime];
    return date1 == date2;       // HERE IS WHERE THINGS SEEM TO FAIL

}
3个回答

44

您正在比较两个指针值。 您需要使用NSDate比较方法,例如:

return ([date1 compare:date2] == NSOrderedSame);

这不是被称为isEqual:吗? - Iulian Onofrei

8
与C语言相同(Objective-C是其超集),==(相等)运算符比较两个指针值,以查看它们是否相等(即如果两个变量持有相同的对象)。虽然这适用于比较原始值(例如intcharbool),但它不适用于Objective-C对象,这些对象在内容上可能相等,但在内存位置上不同(这是相等运算符比较的内容)。
要检查两个对象是否相等,NSObject提供了一个-isEqual:方法,您可以将其用作一般语句(例如[date1 isEqual:date2]),某些类选择提供更具体的比较方法,例如用于比较NSDate-isEqualToDate:或用于比较NSString-isEqualToString:。这些方法不能用于比较原始类型(例如int),因为它们不是对象,但几乎所有对象都可以使用这些方法。

5
在Objective-C中,您不能使用==来比较对象的相等性(它将采用C的含义,比较指针)。与其他语言一样,您只是在比较对象指针。
您需要使用的消息是isEqualToDate:,也就是[date1 isEqualToDate:date2]

3
“在 Objective-C 中从不可以使用 ==”这句话有些过于严厉了。当然可以使用它,只是不能用于 Greg 此时问的目的。你所写的内容是正确的,但措辞有点奇怪。 - Itai Ferber
1
isEqualToDate检查精确相等性,因此它可能永远不会返回true。 - jdog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接