获取两个NSDate之间的准确时差



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

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

一个简单的计算,如/60/60/24等计算出分钟,小时和天没有考虑到他们。

假设我需要计算现在的时间([NSDate date])和12月25日10:22PM(用户使用日期选择器[datePicker date]选择的日期)之间的差异,只是作为一个例子,我该怎么做?
知道确切的时间差不是关键,只要我能准确地知道日、月、年的时间差就行了。

来自Apple的日期&Time编程指南:

清单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完全独立于Timezone。NSDate甚至没有日光节约时间。只有将NSDate转换为人类可读的格式(MM/DD/YY, HH:MM:SS格式或类似格式)时,时区才会出现。

确保在创建 NSDate(s)时考虑到正确的时区,夏令时设置。随后,方法[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];

最新更新