两个日期之间的时间间隔总是会有一天的差异
我正在尝试计算两个日期之间的天数。这里是我正在做它:两个日期之间的时间间隔总是会有一天的差异
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];
的日期格式不会有什么关系呢。正在发生的事情是NSDateComponents
正在给你你所要求的,几年,几个月和几天的总差额。如果你只想要这些日子,你只需要提供NSDayCalendarUnit
。该docs明确这一点:
一些操作可以是模糊的,并且计算的行为是日历专用的,但一般大的组件将之前更小的组件来计算;例如,在公历中,结果可能是1个月和5天,而不是例如0个月和35天。
我之前做过,而且得到了相同的结果:1天差额而不是29天。 – pedroremedios 2014-09-05 22:41:54
我刚刚使用NSDayCalendarUnit运行代码,输出如下: dateToCheck:2014-10-05 22:26:32 +0000 当前日期:2014-09-05 22:43:12 +0000
在这里是一样的。我的代码的第一个版本很好。它返回1在其他地方:) – pedroremedios 2014-09-06 00:07:38
NSDate不知道“格式”的任何内容。你如何创建存储在你的属性中的NSDates - 如果你正在解析字符串,那么它肯定关心格式 – Paulw11 2014-09-05 22:29:02
我给我的问题添加了新的代码。其实我对寻找多少天更感兴趣。 – pedroremedios 2014-09-05 22:37:55
如果您使用NSDateFormatter将字符串日期解析到NSDate中,并且不指定任何格式,则使用的日期格式将是您的语言环境的“默认”格式。此外,日期格式化程序将假定日期值(除非它携带时区指示符)是“本地时间”,并将其映射到生成的NSDate对象中的GMT/UTC时间。网络是你必须非常小心地注意日期转换操作。 (请记住,NSDate对象*总是*应该包含UTC时间。) – 2014-09-06 00:04:55