有没有办法找出两个NSDate
之间的准确差异?
我找到了解决方案,但它们不够准确。我需要考虑夏令时,不同月份的天数不同等等。
一个简单的计算,如/ 60/60/24等,可以计算出分钟,小时和天数,但不考虑它们。
让我们说我需要弄清楚现在的时间([NSDate date]
)和12月25日晚上10点22分(用户使用日期选择器[datePicker date]
选择的日期)之间的差异,例如,如何我会这样做吗?
知道确切的时差并不是关键,只要我有天,月和年的准确差异,就可以了。
答案 0 :(得分:25)
来自Apple的Date & Time Programming Guide:
清单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];
答案 1 :(得分:15)
NSDate完全独立于时区。夏令时甚至还没有出现在NSDate的图片中。只有当您将NSDate转换为人类可读格式(MM / DD / YY,HH:MM:SS格式等)时,时区才能进入画面。
确保在 创建 NSDate时考虑正确的时区,日光节约设置。随后,方法[date1 timeIntervalSinceDate:date2]
应始终为您提供准确的时差。
答案 2 :(得分:2)
因此,您要问的更准确的问题是:如何从两个日期之间的差异中获得格式良好的日期,月份,年份。首先,您需要获取nsTimerInterval(以秒为单位的时间差),然后对其进行格式化:
How do I break down an NSTimeInterval into year, months, days, hours, minutes and seconds on iPhone?
答案 3 :(得分: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];