举个例子,我在同一时区NSDate
中有2个UTC
NSDate *date1 = [NSDate dateWithString:@"2019-05-31 22:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2019-06-01 01:00:00 +0000"];
我想创建一个函数来计算它们之间在年,月,日中忽略时间部分的差异。期望结果高于
年份:0
月:1
日:1
或另一个带有
的示例NSDate *date1 = [NSDate dateWithString:@"2019-02-28 22:00:00 +0000"];
NSDate *date2 = [NSDate dateWithString:@"2020-03-01 01:00:00 +0000"];
会得到结果
年份:1
月:13
日:367
我已经尝试过How can I calculate the difference between two dates?这个问题的答案
但是,由于一年365天或366天,使用NSTimeInterval
的方法似乎并不可靠,并且不会忽略时间。像
NSDateComponents *components;
NSInteger days;
components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit
fromDate: date1 toDate: date2 options: 0];
days = [components day];
也给出错误的结果。
答案 0 :(得分:1)
您可以使用NSDate
的{{1}}方法将每个NSDateComponents
值转换为NSCalendar
值。这将为您提供两个日期的年,月和日值,现在实现您的差异算法,该算法可能是:
componentsInTimeZone:fromDate:
值来确定日期NSDate
值的年份成分的简单减法NSDateComponents
/ { {1}}方法在这里应该有帮助)尽管对所需算法的这种猜测可能是错误的,但是无论您采用哪种算法,都应该能够基于年,月和日组成部分来实现它。 HTH
更新
所以我对您的算法的第一个猜测是错误的,我的第二个猜测是您的三个区别;年,月,日;都意味着是相应单位中差异的独立近似值。因此,年份差异忽略了月份,日期和时间;月差忽略了日期和时间;而天差忽略了时间。这就是为什么5月31日和6月1日相隔“ 1个月”的原因-忽略了这一天。这种猜测当然也可能是错误的,但是这是如何做的:
NSCalendar
的方法之一来执行此操作。 NSDate
仅请求 日期部分来查找您的日差 [注意:请谨慎使用与原始日期相同的时区–这有点奇怪,因为您可能需要自己从日期字符串中提取它(提取+ hhmm并设置一个时区)。您必须记住,NSCalendar
不会存储时区,而只是存储绝对时间点(因此,不同时区中的等效时间会产生相同的components:fromDateComponents:toDateComponents:options:
值),并且您要根据它们进行计算在原始时区中,同一时区中的同一天可以是同一天的两次,也可以在不同时区中的不同日期...)。您可以设置NSDate
实例的时区,也可以使用从NSDate
转换为NSCalendar
]