0
NSDateComponents *components;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
                                             fromDate: startDate 
                                               toDate: endDate options: 0];
days = [components day];

该代码似乎在计算日期之间的确切差异时产生了一些问题:有可能吗???

我正在考虑改用公历……怎么样?

4

1 回答 1

4

首先,components:fromDate:toDate返回两个日期之间的差值。因此,从 2010 年 10 月 1 日到 2010 年 12 月 31 日的差异预计为 91 天,并且您必须添加一天以包括开始日期和结束日期。

问题是:为什么函数返回 90 天而不是 91?

问题在于日历使用的时区,因此也是日期组件使用的时区。默认情况下,使用本地时区。例如,让我们假设当地时区是“欧洲/柏林”。

那么开始日期是本地时区的“2010-10-01 02:00:00”,因为夏令时在 10 月初有效,结束日期是 2010-12-31 01:00:00在当地时区,因为夏令时在 12 月不活动。这两个日期之间的差异是 90 天和 23 小时,而不是 91 天!

要解决此问题,您可以

  • 根据您当地的时区创建开始和结束日期,或
  • 将时区设置为“GMT”以进行差异计算。

第二种解决方案的示例:

// 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
于 2012-12-01T11:43:30.367 回答