Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 计算年、月、日和忽略时间中两个NSDate之间的差异?_Ios_Objective C_Nsdate_Nscalendar - Fatal编程技术网

Ios 计算年、月、日和忽略时间中两个NSDate之间的差异?

Ios 计算年、月、日和忽略时间中两个NSDate之间的差异?,ios,objective-c,nsdate,nscalendar,Ios,Objective C,Nsdate,Nscalendar,举个例子,我有两个NSDate在同一时区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

举个例子,我有两个
NSDate
在同一时区
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

我试过这个问题的答案

但是那些使用
NSTimeInterval
的方法似乎不可靠,因为一年中有365天或366天,并且不忽略时间。回答像

NSDateComponents *components;
NSInteger days;

components = [[NSCalendar currentCalendar] components: NSDayCalendarUnit 
    fromDate: date1 toDate: date2 options: 0];
days = [components day];

也给出错误的结果。

您可以使用
NSCalendar
组件时区:fromDate:
方法将每个
NSDate
值转换为
NSDateComponents
值。这将为您提供两个日期的年、月和日值,现在实现您的差分算法,可能是:

  • 从较大的日期中减去较早的日期-您可以通过比较两个
    NSDate
    值来确定
  • 年份差异只是
    NSDateComponents
    值的年份分量的简单减法
  • 月差是月组成部分之间的差,如果为负,则加12
  • 日差是相似的,但在负的情况下,您必须添加月长,即28、29、30或31-作为练习留作计算:-(
    NSCalendar
    /
    NSDate
    方法应该在这里有所帮助)
虽然对所需算法的这种猜测可能是错误的,但无论您的算法是什么,您都应该能够基于年、月和日组件来实现它。嗯

更新

所以我第一次猜测你的算法是错误的,第二次猜测是你的三个不同点;年、月、日;均表示为相应单位中差值的独立近似值。因此,年差忽略了月份、天数和时间;月差忽略日期和时间;日差忽略了时间。这就是为什么5月31日和6月1日相隔“一个月”——这一天被忽略了。当然,这种猜测也可能是错误的,但下面是如何做到这一点:

  • 为你安排两次约会,这样差别就会是正的
  • 只获取年、月和日组件(或者全部获取,然后丢弃其他组件)——这将丢弃时间组件。使用
    NSCalendar
    的方法之一执行此操作
  • 您的年份差异就是年份组件之间的差异
  • 你的月差是你的月组成部分(可能是负的)加上你的年差的12倍
  • 您可以使用
    组件:fromDateComponents:toDateComponents:options:
    仅请求日期组件来查找日差

[注意:小心使用与原始日期相同的时区-这有点复杂,因为您可能需要自己从日期字符串中提取它(提取+hhmm并创建时区)。您必须记住,
NSDate
不存储时区,它只是一个绝对时间点(因此,不同时区中的等效时间会产生相同的
NSDate
值),对于您的计算,您希望它们基于原始时区,因为一个时区中同一天的两次可能在不同时区中的不同日期…)。您可以设置
NSCalendar
实例的时区,或者使用从
NSDate
转换为
NSDateComponents
]时采用时区的方法。第一个示例的差异是3小时,即0个月和0天。第二个示例的结果是1年0个月1天。如果指定了单位年,您将永远不会得到月>12,如果指定了单位月,您将永远不会得到天>365。和
dateWithString
API长期以来被弃用。@我想根据日历值进行比较。在第一个示例中,date1在5月,date2在6月,所以我想要的结果是1。与Day相同也不关心
dateWithString
,我用它来演示
NSDate
值只能比较两个日期。但你只能指定一个单位,结果会更大,也会更小。@Vadian谢谢,但我想通过数字得到差值谢谢。我试着按照你的建议去做,但我把这个问题贴在这里,希望你能帮到我way@BùiĐứcKhánh–我对您的目标有了另一个猜测,该算法产生的结果与您的两个示例相同。当然,你应该详细说明你想要的“差异”的定义,而不是给出几个例子,这样人们就不得不尝试猜测来帮助你。希望这个有帮助。