NSDateComponents *components;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: startDate
toDate: endDate options: 0];
days = [components day];
该代码似乎在计算日期之间的确切差异时会产生一些问题:是否可能???
我想用格里高利历来代替......怎么样?
答案 0 :(得分:4)
首先,components:fromDate:toDate
会在两个日期之间返回差异。因此,人们预计2010-10-01至2010-12-31之间的差异为91天,您必须添加一天以包括开始日期和结束日期。
问题是:为什么函数返回90天而不是91?
问题在于日历使用的时区以及日期组件。默认情况下,使用本地时区。我们假设当地时区是“欧洲/柏林”。
然后在当地时区的开始日期是“2010-10-01 02:00:00”,因为夏令时在10月初有效,结束日期是2010-12-31 01:在当地时区00:00,因为夏令时在12月没有活动。这两个日期之间的差异是90天23小时,而不是91天!
要解决问题,您可以
第二种解决方案的示例:
// Create start and end date as in your example:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
[dateFormatter setDateFormat:@"yyyy-MM-dd"];
NSDate *startDate = [dateFormatter dateFromString:@"2010-10-01"];
NSDate *endDate = [dateFormatter dateFromString:@"2010-12-31"];
NSLog(@"start=%@", startDate);
NSLog(@"end =%@", endDate);
// Output:
// start=2010-10-01 00:00:00 +0000
// end =2010-12-31 00:00:00 +0000
// Compute difference according to GMT:
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDateComponents *components;
components = [gregorian components: NSDayCalendarUnit
fromDate: startDate
toDate: endDate
options: 0];
int days = [components day];
// --> days = 91