两个日期之间的时间间隔总是会有一天的差异

问题描述:

我正在尝试计算两个日期之间的天数。这里是我正在做它:两个日期之间的时间间隔总是会有一天的差异

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 

unsigned int calendarFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; 
NSDate *dateToCheck = (self.subscriptionEnd ?: self.trialEnd); 
NSLog(@"dateToCheck: %@", dateToCheck); 
NSLog(@"current date: %@", [self systemTimeZoneDate]); 
NSDateComponents *components = [gregorian components:calendarFlags 
              fromDate:[self systemTimeZoneDate] 
               toDate:dateToCheck 
              options:0]; 
return [components day] >= 0 ?: 0; 

在写这篇文章的时候,的NSLog输出如下:

2014-09-05 22:56:20.054 tweepy[9635:60b] dateToCheck: 2014-10-05 08:02:51 PM +0000 
2014-09-05 22:56:20.057 tweepy[9635:60b] current date: 2014-09-05 10:56:20 PM +0000 

,因为iOS的认为这一天是在它返回每一天的差异YDM格式。

我应该在某处指出日期格式吗?

这里是self.subscriptionEnd是如何设置的代码:

NSCalendar *gregorianCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
dateComponents.day = 30; 
self.subscriptionEnd = [gregorianCalendar dateByAddingComponents:dateComponents toDate:[self systemTimeZoneDate] options:0]; 

下面是如何self.trialEnd的代码设置:

NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; 
dateComponents.day = 2; 
self.trialEnd = [gregorian dateByAddingComponents:dateComponents toDate:[self systemTimeZoneDate] options:0]; 
+1

NSDate不知道“格式”的任何内容。你如何创建存储在你的属性中的NSDates - 如果你正在解析字符串,那么它肯定关心格式 – Paulw11 2014-09-05 22:29:02

+0

我给我的问题添加了新的代码。其实我对寻找多少天更感兴趣。 – pedroremedios 2014-09-05 22:37:55

+0

如果您使用NSDateFormatter将字符串日期解析到NSDate中,并且不指定任何格式,则使用的日期格式将是您的语言环境的“默认”格式。此外,日期格式化程序将假定日期值(除非它携带时区指示符)是“本地时间”,并将其映射到生成的NSDate对象中的GMT/UTC时间。网络是你必须非常小心地注意日期转换操作。 (请记住,NSDate对象*总是*应该包含UTC时间。) – 2014-09-06 00:04:55

的日期格式不会有什么关系呢。正在发生的事情是NSDateComponents正在给你你所要求的,几年,几个月和几天的总差额。如果你只想要这些日子,你只需要提供NSDayCalendarUnit。该docs明确这一点:

一些操作可以是模糊的,并且计算的行为是日历专用的,但一般大的组件将之前更小的组件来计算;例如,在公历中,结果可能是1个月和5天,而不是例如0个月和35天。

+0

我之前做过,而且得到了相同的结果:1天差额而不是29天。 – pedroremedios 2014-09-05 22:41:54

+0

我刚刚使用NSDayCalendarUnit运行代码,输出如下: dateToCheck:2014-10-05 22:26:32 +0000 当前日期:2014-09-05 22:43:12 +0000 日:29 – hukir 2014-09-05 22:45:36

+0

在这里是一样的。我的代码的第一个版本很好。它返回1在其他地方:) – pedroremedios 2014-09-06 00:07:38