Iphone dateByAddingComponents并使用NSDateComponents获取日期差
我在为日期添加值以及日期之间的差异方面遇到了问题。 计算的日期和组件不正确 所以对于加法,如果我加1.5个月,我只得到1个月,但是如果我加上任何整数(1、2、3等等),它的计算是正确的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
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是日期选择器名称。你对变量名的看法是绝对正确的,不过,我在帖子中没有考虑案例就更改了它们。