Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/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
Iphone dateByAddingComponents并使用NSDateComponents获取日期差_Iphone_Date_Nscalendar - Fatal编程技术网

Iphone dateByAddingComponents并使用NSDateComponents获取日期差

Iphone dateByAddingComponents并使用NSDateComponents获取日期差,iphone,date,nscalendar,Iphone,Date,Nscalendar,我在为日期添加值以及日期之间的差异方面遇到了问题。 计算的日期和组件不正确 所以对于加法,如果我加1.5个月,我只得到1个月,但是如果我加上任何整数(1、2、3等等),它的计算是正确的 Float32 addAmount = 1.5; NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; [components setMonth:addAmount]; NSCalendar *gregori

我在为日期添加值以及日期之间的差异方面遇到了问题。 计算的日期和组件不正确

所以对于加法,如果我加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];
我做错了什么?此外,我还在adding和difference函数的选项中添加了kCFCalendarComponentsWrap constanct,但没有任何区别

谢谢

因此,如果我加上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];
NSDateComponents
中的
setMonth:
方法采用的是
NSInteger
,而不是浮点数。因此,该行为是正确的,因为它只是将1.5截断为1

如果我有约会的话,现在就不同了 加上一个 年份(与上面的代码几乎相同),它 正确添加,但当 如果计算出差值,则得到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];
除非您展示如何创建Date1和Date2变量的代码,否则没有真正的方法来说明

(您还泄漏了上面的内存;始终将alloc与
release
/
autorelease
匹配。并且尽量不要给变量大写字母,因为作为样式的问题,这应该只对类名进行)

因此,如果我加上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];
NSDateComponents
中的
setMonth:
方法采用的是
NSInteger
,而不是浮点数。因此,该行为是正确的,因为它只是将1.5截断为1

如果我有约会的话,现在就不同了 加上一个 年份(与上面的代码几乎相同),它 正确添加,但当 如果计算出差值,则得到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];
除非您展示如何创建Date1和Date2变量的代码,否则没有真正的方法来说明


(您还泄漏了上面的内存;始终将alloc与
发布匹配
/
自动释放匹配
。尽量不要给变量大写字母,因为就样式而言,这只应用于类名)

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


感谢Shaggy Frog为我指引了正确的方向。

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


感谢Shaggy Frog为我指引了正确的方向。

我没有注意到内存泄漏,谢谢你发现了它。日期变量通常由uidatepicker创建,代码为date1=self.dob.date;其中,dob是日期选择器名称。不过你对变量名的看法完全正确,我在发布时没有考虑大小写就更改了它们。我没有注意到内存泄漏,谢谢你发现了它。日期变量通常由uidatepicker创建,代码为date1=self.dob.date;其中,dob是日期选择器名称。你对变量名的看法是绝对正确的,不过,我在帖子中没有考虑案例就更改了它们。