在两个NSDate之间获得准确的时间差?

有没有办法找出两个NSDate之间的准确差异?

我找到了解决方案,但它们不够准确。 我需要考虑夏令时,不同月份的天数不同等等。

一个简单的计算,如/ 60/60/24等,可以计算出分钟,小时和天数,但不考虑它们。

让我们说我需要弄清楚现在的时间( [NSDate date] )和12月25日晚上10:22(用户使用日期选择器[datePicker date]选择的[datePicker date] )之间的[datePicker date] ,作为一个例子,我该怎么做?
知道确切的时差并不是关键,只要我有几天,几个月和几年的准确差异,就可以了。

来自Apple的日期和时间编程指南 :

清单12获取两个日期之间的差异

 NSDate *startDate = ...; NSDate *endDate = ...; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSUInteger unitFlags = NSMonthCalendarUnit | NSDayCalendarUnit; NSDateComponents *components = [gregorian components:unitFlags fromDate:startDate toDate:endDate options:0]; NSInteger months = [components month]; NSInteger days = [components day]; 

NSDate完全独立于时区。 对于NSDate,夏令时甚至都没有出现。 只有当您将NSDate转换为人类可读格式(MM / DD / YY,HH:MM:SS格式等)时,时区才能进入画面。

创建 NSDate时,请确保考虑正确的时区,日光保存设置。 随后,方法[date1 timeIntervalSinceDate:date2]应该总能给你准确的时差。

因此,您要问的更准确的问题是:如何从两个日期之间的差异中获得格式良好的日期,月份,年份。 首先,您希望获得nsTimerInterval(以秒为单位的时差),然后对其进行格式化:

如何在iPhone上将NSTimeInterval分解为年,月,日,小时,分钟和秒?

最新iOS代码的小更新:

 NSDate *startDate = ...; NSDate *endDate = ...; NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; NSUInteger unitFlags = NSCalendarUnitMonth | NSCalendarUnitDay; NSDateComponents *components = [gregorian components:unitFlags fromDate: startDate toDate:endDate options:0]; NSInteger months = [components month]; NSInteger days = [components day];