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

11

有没有办法精确地找出两个NSDate的差异?

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

简单的计算,比如/60/60/24等来计算分钟、小时和天数,都没有考虑这些因素。

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


如何将 NSTimeInterval 分解为年、月、日、小时、分钟和秒?可能是重复问题。 - d.lebedev
1
历法计算很难。聪明人经常会犯错。最大的陷阱是认为它很简单。慢慢来,期望在路上犯错误。需要注意的是,Cocoa提供了很好的工具来正确地进行计算,但似乎没有易于使用的“做我想做”的工具。第一步是阅读和反复阅读文档,并对自己的理解进行反复推测。只有清晰地理解它们,才能完全定义您的实际问题和解决方案。这可能很令人沮丧,但实际上他们提供了强制你正确操作的工具(经过一番努力后)。 - uchuugaka
4个回答

25

以下内容摘自苹果公司的日期和时间编程指南:

代码清单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];

15

NSDate完全独立于时区。对于NSDate而言,夏令时甚至没有影响。只有当您将NSDate转换为人类可读格式(如MM / DD / YY、HH:MM:SS格式等)时,时区才会介入。

创建NSDate时,请确保考虑正确的时区和夏令时设置。随后,[date1 timeIntervalSinceDate:date2]方法应始终为您提供准确的时间差异。


1
问题在于该方法可以得到两个日期之间准确的秒数,但将其转换为天、月和年是不准确的,因为考虑到每个月或年有多少天太过复杂,改变分隔符了解吗?这就是我避免使用它的原因。 - Josh Kahane
Sanjay Chaudhry的回答解答了你的问题。我猜你没有提出一个足够精确的问题。 - ader

2

0

关于最新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];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接