我希望仅根据当天比较NSDate
个对象(忽略时间)。而不是将时间转换为0:00:00,或像大多数解决方案一样使用NSDateComponent
(例如Comparing two NSDates and ignoring the time component)
是否有人发现使用int
方法将日期转换为表示自1970年以来的天数的timeIntervalSince1970
有问题?
return (int)([date timeIntervalSince1970]/(SECONDS_PER_DAY));
答案 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