两个日期之间经过的天数总是给出一天的差异

时间:2014-09-05 22:11:05

标签: ios objective-c nsdate nscalendar

我正在尝试计算两个日期之间的天数。我是这样做的:

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 个答案:

答案 0 :(得分:1)

日期格式与它无关。正在发生的事情是NSDateComponents正在为您提供您所要求的内容,即年,月和日的总差异。如果您只想要日期,则只需提供NSDayCalendarUnitdocs明确指出:

  

某些操作可能不明确,并且计算的行为是特定于日历的,但通常在较小的组件之前计算较大的组件;例如,在公历中,结果可能是1个月和5天,而不是例如0个月和35天。