【问题标题】:Elapsed days between two dates always giving one days difference两个日期之间经过的天数总是相差一天
【发布时间】:2014-09-05 22:11:04
【问题描述】:

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

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];

【问题讨论】:

  • NSDate 对“格式”一无所知。你如何创建存储在你的属性中的 NSDates - 如果你正在解析字符串,那么它肯定会关心格式
  • 我在我的问题中添加了新代码。其实我更感兴趣的是找到多少天。
  • 如果您使用 NSDateFormatter 将字符串日期解析为 NSDate,并且不指定任何格式,则使用的日期格式将是您所在地区的“默认”格式。此外,日期格式化程序将假定日期值(除非它带有时区指示符)是“本地时间”,并将其映射到生成的 NSDate 对象中的 GMT/UTC 时间。 Net-net 是您必须非常小心注意日期转换操作。 (请记住,NSDate 对象总是应该包含 UTC 时间。)
  • 一旦您将日期写入 NSDate 对象,它就没有“格式”,并且它的时区固定为 UTC。当您使用 NSDateFormatter 转换回字符串形式时,您映射到所需的时区和格式。
  • (但请注意NSCalendar确实有时区设置,在提取组件等时需要考虑)

标签: ios objective-c nsdate nscalendar


【解决方案1】:

日期格式与它没有任何关系。正在发生的事情是NSDateComponents 正在给你你所要求的,年、月和日的总差异。如果您只需要几天,您只需提供NSDayCalendarUnitdocs 说明了这一点:

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

【讨论】:

  • 我之前也这样做过,结果相同:相差 1 天而不是 29 天。
  • 我刚刚使用 NSDayCalendarUnit 运行代码,输出如下: dateToCheck: 2014-10-05 22:26:32 +0000 当前日期:2014-09-05 22:43:12 +0000 天:29
  • 是的,这里也一样。我的代码的第一个版本很好。它在其他地方返回 1 :)
  • return [components day] >= 0 ?: 0; 返回 1 为真。我已将该行改写为return [components day] >= 0 ? [components day]: 0;
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-28
  • 2011-03-19
  • 2013-07-24
  • 2010-12-09
相关资源
最近更新 更多