2012-11-30 51 views
0
NSDateComponents *components; 
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
              fromDate: startDate 
               toDate: endDate options: 0]; 
days = [components day]; 

该代码似乎会产生一些问题,计算日期之间的确切区别:是否有可能?日期差异:currentCalendar vs. gregorianCalendar

我正在考虑使用公历日历来代替......怎么样?

+0

获得帮助这里的最好的办法是提供您所期望得到一个答案,什么你实际上得到一个例子。包括我们需要的所有数据(如startDate和endDate)以复制您的问题。 – lnafziger

+0

这里是日志:开始日期:2010-10-01 00:00:00 +0000结束日期:2010-12-31 00:00:00 +0000天数:90应该是92天,不是吗?来自该日志的任何想法? – Fabrizio

+0

可能我需要包含StartDate和EndDate才能有92天? – Fabrizio

回答

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 
+0

setTimeZone:[NSTimeZone timeZoneWithName:@“UTC”]应该给出相同的结果? – Fabrizio

+0

@Fabrizio:我强烈地假设如此。但我不是GMT和UTC之间细微差异的专家,所以你可以自己做一些研究来验证这一点。来自维基百科的[协调世界时](http://en.wikipedia.org/wiki/Coordinated%5FUniversal%5FTime)指出:“对于大多数用途而言,UTC与GMT同义,但GMT不再由科学界精确定义“。 –