计算年,月,日的2个NSDate之间的时差忽略时间?

时间:2019-06-30 08:54:00

标签: ios objective-c nsdate nscalendar

举个例子,我在同一时区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];

也给出错误的结果。

1 个答案:

答案 0 :(得分:1)

您可以使用NSDate的{​​{1}}方法将每个NSDateComponents值转换为NSCalendar值。这将为您提供两个日期的年,月和日值,现在实现您的差异算法,该算法可能是:

  • 从较大的日期中减去较早的日期-您可以通过比较两个componentsInTimeZone:fromDate:值来确定日期
  • 年份差只是NSDate值的年份成分的简单减法
  • 月份差是月份组成部分之间的差,如果为负,则添加12
  • 日差相似,但在负数情况下,您必须添加月份的长度,即28、29、30或31-计算该数字作为练习:-)(NSDateComponents / { {1}}方法在这里应该有帮助)

尽管对所需算法的这种猜测可能是错误的,但是无论您采用哪种算法,都应该能够基于年,月和日组成部分来实现它。 HTH

更新

所以我对您的算法的第一个猜测是错误的,我的第二个猜测是您的三个区别;年,月,日;都意味着是相应单位中差异的独立近似值。因此,年份差异忽略了月份,日期和时间;月差忽略了日期和时间;而天差忽略了时间。这就是为什么5月31日和6月1日相隔“ 1个月”的原因-忽略了这一天。这种猜测当然也可能是错误的,但是这是如何做的:

  • 为您安排两个约会,所以差额将为正。
  • 仅获取年,月和日部分(或全部获取,然后丢弃其他部分)–这将丢弃时间部分。使用NSCalendar的方法之一来执行此操作。
  • 您的年份差异就是年份组成部分之间的差异
  • 您的月份差异是月份组成部分之间的差异(可能为负)加上您的年度差异的12倍
  • 您可以通过NSDate仅请求 日期部分来查找您的日差

[注意:请谨慎使用与原始日期相同的时区–这有点奇怪,因为您可能需要自己从日期字符串中提取它(提取+ hhmm并设置一个时区)。您必须记住,NSCalendar不会存储时区,而只是存储绝对时间点(因此,不同时区中的等效时间会产生相同的components:fromDateComponents:toDateComponents:options:值),并且您要根据它们进行计算在原始时区中,同一时区中的同一天可以是同一天的两次,也可以在不同时区中的不同日期...)。您可以设置NSDate实例的时区,也可以使用从NSDate转换为NSCalendar]

时采用时区的方法