1

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

因此,对于添加,如果我添加 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 常量,但没有区别。

谢谢

4

2 回答 2

1

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

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

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

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

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

于 2010-03-25T01:18:45.737 回答
0

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

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

于 2010-03-25T04:08:05.310 回答