2011-05-12 53 views
1
NSDateComponents *components = [[[NSDateComponents alloc] init] autorelease]; 
[components setTimeZone:[ NSTimeZone timeZoneForSecondsFromGMT:(+0*3600) ] ] ; 
[components setYear:2011]; 
[components setDay:13]; 
[components setMonth:5]; 
NSDate *date1 = [gregorianCalendar dateFromComponents:components]; 
NSDate *date2 = [[NSDate alloc] init]; 


    NSTimeInterval diff = [data2 timeIntervalSinceDate:date1]; 
    NSString *intervalString = [NSString stringWithFormat:@"%f", diff]; 
    int second = [intervalString intValue]; 
    int period = second/3600/24; 
    NSLog(@"period:%d", period); 
    NSLog(@"date1:%@", data1); 
    NSLog(@"date2:%@", data2); 

在CONSOL结果是:的iOS:问题的NSDate和NSDateComponent

2011-05-12 10:57:00.406项目[297:707]周期:0;

2011-05-12 10:57:00.375项目[297:707] DATA2:2011-05-12 8点56分52秒0000

2011-05-12 10:57:00.402项目[ 297:707] data1:2011-05-13 00:00:00 +0000

我不明白为什么周期是“0”,它必须是“1”;你可以帮我吗?

回答

0

NSTimeInterval只是一个双精度型,所以你不需要将它转换为一个字符串,然后返回一个int。

,如果你做这样的事情会发生什么:

NSTimeInterval diff = [data2 timeIntervalSinceDate:date1]; 
int period = (int)diff/3600/24; 
NSLog(@"period:%d", period); 

此外,如果间隔DIFF小于3600 * 24 DIFF结果/ 3600/24将小于1,所以int值将被平摊为0.

+0

然后我必须使用一个指令,每个时间段(双)在点后面都有数值。例如,如果我有1,01它必须是2或者如果我有4,67它必须是5 ....对吗? – CrazyDev 2011-05-12 09:40:11

+0

如何使期间成双?那么你不会失去任何精度。 – 2011-05-12 09:56:07

+0

我用“ceil”解决 – CrazyDev 2011-05-12 13:04:03

0

date2是当前日期。不知道为什么period应该在这里。

在写这篇文章时,diff是大约。 -53000。将它分为零,如你所期望的那样。

另外请记住,NSTimeInterval是一个浮点数,并且你通过一个字符串将它转换为一个整数,这将会使分数下降。

并且有没有点在做这种转换通过一个字符串 - 只需使用int seconds = (int) diff;

请复制/粘贴代码直接,因为你参考data1data2,但你的变量被称为date1date2。但是,如果这些变量是在别处声明的话,那么这可能已经是你的bug了。