可以在不使用日历组件的情况下比较NSDate对象



我希望仅根据日期(忽略时间)比较NSDate对象。不像大多数解决方案那样将时间转换为0:00:00,或使用NSDateComponent(例如,比较两个NSDates并忽略时间分量)

有人认为用timeIntervalSince1970方法将日期转换为代表1970年以来天数的int有问题吗?

return (int)([date timeIntervalSince1970]/(SECONDS_PER_DAY));

当然。约会数学有无数的陷阱。使用NSDateComponents;它们并不难。

NSCalendar *cal = [NSCalendar currentCalendar];
NSDateComponents *date1Components = [cal components:NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:date1];
NSDateComponents *date2Components = [cal components:NSEraCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit fromDate:date2];
NSComparisonResult comparison = [[cal dateFromComponents:date1Components] compare:[cal dateFromComponents:date2Components];

这里有一种方法可以在不使用NSCalendar的情况下将NSDate转换为代表原始日期午夜的NSTimeInterval。通过对两个NSDate对象执行此操作,可以在不考虑时间的情况下比较这两个日期。

    NSDate *now = [NSDate date]; // Your original date with time
    NSTimeInterval interval = [now timeIntervalSince1970]; // the full interval
    NSDateFormatter *form = [[NSDateFormatter alloc] init];
    [form setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]; // Zulu time
    [form setDateFormat:@"A"]; // milliseconds since midnight
    NSString *secondsStr = [form stringFromDate:now];
    NSTimeInterval seconds = [secondsStr integerValue] / 1000.0; // seconds since midnight
    NSTimeInterval justDate = interval - seconds; // interval for date at midnight (Zulu time)
    // For testing purposes
    NSDate *nowDate = [NSDate dateWithTimeIntervalSince1970:justDate];
    NSLog(@"now = %@, interval = %f", now, interval);
    NSLog(@"seconds = %@", secondsStr);
    NSLog(@"justDate = %f, nowDate = %@", justDate, nowDate);

这可能比诺亚的回答中所示的NSCalendar更好,也可能不更好。

你绝对不能简单地除以SECONDS_PER_DAY。这完全是错误的。

NSCalendar.currentCalendar().compareDate(date1, toDate: date2, toUnitGranularity: .Day)

返回NSComparisonResult

以下是苹果公司对它的看法

最新更新