iOS: проблема с NSDate и NSDateComponent - PullRequest
1 голос
/ 12 мая 2011
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);

В итоге получается:

2011-05-12 10: 57: 00.406 Проект [297: 707] период: 0;

2011-05-12 10: 57: 00.375 Проект [297: 707] data2: 2011-05-12 08:56:52 + 0000

2011-05-12 10:57: 00.402 Проект [297: 707] data1: 2011-05-13 00:00:00 + 0000

Я не понимаю, почему период равен "0", он должен быть "1";Вы можете мне помочь?

Ответы [ 2 ]

0 голосов
/ 12 мая 2011

date2 является текущей датой.Понятия не имею, почему period должно быть здесь .

На момент написания этой статьи diff составляло прибл.-53000.Деление его приводит к нулю, как вы и ожидаете.

Также имейте в виду, что NSTimeInterval - это число с плавающей запятой, и вы преобразуете его через строку в целое число, которое будет отбрасывать дроби.

И бессмысленно делать это преобразование через строку - просто используйте int seconds = (int) diff;.

Пожалуйста, скопируйте / вставьте свой код напрямую , поскольку вы ссылаетесь на data1 и data2, но ваши переменные называются date1 и date2.Но тогда это может быть вашей ошибкой, если эти переменные объявлены в другом месте.

0 голосов
/ 12 мая 2011

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.

...