【问题标题】:Difference between two NSDate objects -- Result also a NSDate两个 NSDate 对象之间的区别——结果也是一个 NSDate
【发布时间】:2011-07-30 13:47:17
【问题描述】:

我有两个 NSDate 对象,我想要两者之间的差异,结果应该再次是一个 NSDate 对象。知道如何实现这一目标吗?

在这里,我试图解决一个独特的问题,我必须找出经过的时间,然后本地化经过的时间。如果我在 NSDate 对象中有经过的时间,我可以对其进行本地化。所以想创建一个 NSDate 对象,它的时间分量与两个日期之间的时间间隔相同,以便我可以使用 NSDateFormatter 对其进行本地化。

【问题讨论】:

  • 任意两个任意选择的日期之间的差始终是 1986 年 2 月 19 日。:-)
  • 对不起,我不明白。 :-P

标签: iphone objective-c cocoa-touch ios nsdate


【解决方案1】:

NSDate 表示时间实例,因此将时间的间隔 表示为NSDate 是没有意义的。你要的是NSDateComponents:

NSDate *dateA;
NSDate *dateB;

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian];
NSDateComponents *components = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay
                                           fromDate:dateA
                                             toDate:dateB
                                            options:0];

NSLog(@"Difference in date components: %i/%i/%i", components.day, components.month, components.year);

【讨论】:

  • 从 iOS 8 开始,日历组件现在(在本例中)为:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay
  • 感谢@AaronAsh,我已经更新了答案以反映最新的常量名称。
  • 在 iOS 8 中不推荐使用 NSGregorianCalendar。替换为 NSCalendarIdentifierGregorian
【解决方案2】:

如果您从 2002 年 5 月 5 日减去 2001 年 12 月 12 日,日期会是什么?两个日期之间的时间距离不可能是一个日期,它总是某种间隔。您可以使用timeIntervalSinceDate: 来计算间隔。

要本地化,您可以尝试以下步骤:

【讨论】:

  • 我明白这一点。但我正在尝试解决一个独特的问题,我必须找出经过的时间,然后本地化经过的时间。如果我在 NSDate 对象中有经过的时间,我可以对其进行本地化。所以想创建一个 NSDate 对象,它的时间分量与两个日期之间的时间间隔相同,以便我可以使用 NSDateFormatter 对其进行本地化。
  • @Abhinav 我明白了,出现了第二个问题:一个月是多少?有些月份有 31 天,有些月份有 30 天。用月份一词表示间隔是非常精确的。您必须考虑到这一点。
【解决方案3】:

NSDate 类参考,你有实例方法来做这些 -

  1. 如何比较两个 NSDate 变量? 回答: isEqualToDate:
  2. 如何找出两个 NSDate 变量之间的差异? 回答: timeIntervalSinceDate:
  3. 如何从 NSDate 变量中获取分钟、小时和天的每个单独值? links

【讨论】:

    【解决方案4】:

    您可以使用NSDatetimeIntervalSinceDate: 计算两个日期之间的时间间隔,但是将时间间隔表示为日期对您来说没有任何意义。

    【讨论】:

      【解决方案5】:

      在 NSDate 中使用 -compare: 有一个简单的方法:

      NSDate *dateA = [NSDate dateWithTimeIntervalSinceNow:100];
      NSDate *dateB = [NSDate dateWithTimeIntervalSinceNow:200];
      NSDate *myDate = [NSDate dateWithTimeIntervalSinceNow:150];
      NSArray *dateArray = [NSArray arrayWithObjects:dateA, dateB, myDate, nil];
      NSArray *sortedArray = [dateArray sortedArrayUsingSelector:@selector(compare:)];
      if ([myDate isEqualToDate:[sortedArray objectAtIndex:1]])
          NSLog(@"myDatea between dateA and dateB");
      

      【讨论】:

        猜你喜欢
        • 2011-11-01
        • 2010-12-31
        • 2012-10-25
        • 1970-01-01
        • 1970-01-01
        • 2013-12-29
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        相关资源
        最近更新 更多