【问题标题】:dateByAddingComponents and getting difference of dates with NSDateComponentsdateByAddingComponents 并使用 NSDateComponents 获取日期差异
【发布时间】:2010-03-25 01:07:06
【问题描述】:

我在向日期添加值以及获取日期之间的差异时遇到问题。 计算的日期和组成部分不正确。

所以对于添加,如果我添加 1.5 个月,我只会得到 1 个月,但是如果我添加任何整数,即(1 或 2 或 3 等),它会正确计算。

Float32 addAmount = 1.5;

NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease];
[components setMonth:addAmount];

NSCalendar *gregorian = [[[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar] autorelease];
 [gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

 NSDate *newDate2 = [gregorian dateByAddingComponents:components toDate:Date1 options:0];

现在差异,如果我有一个添加了恰好一年的日期(与上面的代码几乎相同),它会正确添加,但是当计算差异时,我得到 0 年 11 个月和 30 天。

NSDate *startDate = Date1;
NSDate *endDate = Date2;

NSCalendar *gregorian = [[NSCalendar alloc]
          initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;

NSDateComponents *components = [gregorian components:unitFlags
              fromDate:startDate
                toDate:endDate options:0];

NSInteger years = [components year];
NSInteger months = [components month];
NSInteger days = [components day];

我做错了什么?我还在添加和差分功能的选项中添加了 kCFCalendarComponentsWrap 常量,但没有区别。

谢谢

【问题讨论】:

    标签: iphone date nscalendar


    【解决方案1】:

    所以对于添加,如果我添加 1.5 个月,我 只能获得 1 个月,但是如果我添加任何 整数,即(1 或 2 或 3 等) 它计算正确。

    NSDateComponents 中的setMonth: 方法采用NSInteger,而不是浮点数。所以行为是正确的,因为它只是将 1.5 截断为 1。

    现在有所不同,如果我有约会的话 恰好添加了一个 年(几乎与上面的代码相同),它 添加正确,但当 计算差异,我得到 0 年11个月30天。

    除非您显示如何创建 Date1 和 Date2 变量的代码,否则没有真正的方法可以说明。

    (您也在上面泄漏内存;始终将分配与 release/autorelease 匹配。并且尽量不要给变量大写字母,因为作为风格问题,这应该只为类名字)

    【讨论】:

    • 我没有注意到内存泄漏,感谢您发现它。日期变量通常由 uidatepicker 使用 date1 = self.dob.date; 之类的代码创建。其中 dob 是日期选择器名称。不过,您对变量名的看法是绝对正确的,我在不考虑大小写的情况下更改了它们以进行发布。
    【解决方案2】:

    我终于发现了日期差异的问题,当我将它保存到数据库时,我使用了带双精度值的 timeintervalsince1970,但是在填充它并将其设置为日期选择器时,我使用的是 int 列类型。

    感谢 Shaggy Frog 引导我朝着正确的方向前进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 1970-01-01
      • 2019-05-17
      • 2021-11-03
      • 1970-01-01
      相关资源
      最近更新 更多