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

时间:2013-12-05 23:12:55

标签: ios nsdate

我希望仅根据当天比较NSDate个对象(忽略时间)。而不是将时间转换为0:00:00,或像大多数解决方案一样使用NSDateComponent(例如Comparing two NSDates and ignoring the time component

是否有人发现使用int方法将日期转换为表示自1970年以来的天数的timeIntervalSince1970有问题?

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

3 个答案:

答案 0 :(得分:5)

是的,绝对的。日期数学有无穷无尽的陷阱。使用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];

答案 1 :(得分:0)

这是一种将NSDate转换为NSTimeInterval的方法,它代表原始日期的午夜,而不使用NSCalendar。使用两个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。那将是错误的。

答案 2 :(得分:0)

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

返回NSComparisonResult

Here is what apple talks about it