上述示例仅代表解决方案的一半,因为大多数解决方案在计算差异时仅考虑日期值(例如:2010-11-01)但是在现实世界中场景 NSDate 实例总是与时间结合在一起,也会影响结果的差异。
现在,让我们谈谈用户定义两个日期但没有为它们定义时间的公认解决方案。
NSString *start = @"2010-09-01";
NSString *end = @"2010-09-02";
NSDateFormatter *f = [[NSDateFormatter alloc] init];
[f setDateFormat:@"yyyy-MM-dd"];
NSDate *startDate = [f dateFromString:start];
NSDate *endDate = [f dateFromString:end];
这里两个日期的时间相同,因为没有为它们提供时间,这意味着它不会影响差异计算。
startDate "2010-09-01 12:00 AM"
endDate "2010-09-02 12:00 AM"
结果将是 days = 1
现在让我们为这两个日期添加一个具体时间:
startDate "2010-09-01 02:00 PM"
endDate "2010-09-02 02:00 AM"
添加特定时间后,结果会发生变化。现在 days = 0 即使日期中定义的日期不同。 这是因为两个日期的时间差小于 24 小时。
只要满足以下条件,这种计算方法就可以正常工作:
或者
但是,如果您想根据日历日期更改计算天差,那么就会出现问题,因为在上面的示例中,即使日历日期更改了,但结果会是 days = 0。这是因为时差小于24小时。
那么,我们如何根据日历日期变化计算天差。这是 Apple 建议的做法:
@implementation NSCalendar (MySpecialCalculations)
- (NSInteger)daysWithinEraFromDate:(NSDate *)startDate toDate:(NSDate *)endDate {
NSInteger startDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:startDate];
NSInteger endDay=[self ordinalityOfUnit:NSDayCalendarUnit inUnit: NSEraCalendarUnit forDate:endDate];
return endDay - startDay;
}
@end
更多详情可here
我在主题上的两分钱代表图片的剩余一半。