NSDate вопрос - PullRequest
       2

NSDate вопрос

0 голосов
/ 06 апреля 2011

Я рассчитываю разницу месяцев между двумя датами, используя:

NSInteger month = [[[NSCalendar currentCalendar] components: NSMonthCalendarUnit fromDate: start toDate: end options: 0] month];

Когда он вычисляет месяцы, у меня небольшая проблема. Предположим, что:

startdate = 01/05/2005; (Дд / мм / год) конечная дата = 01/06/2005; (Дд / мм / год)

Разница в месяце возвращается как 0. Я заметил, что для возврата правильного результата (в данном случае это 1), мне нужно установить конечную дату в + 1 дней от даты начала. Итак, 02.06.2005. Как я могу это исправить?

Ответы [ 5 ]

1 голос
/ 06 апреля 2011

Попробуйте установить часовой пояс на UTC.

Вот пример кода, который возвращает 1 для разницы.

NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"dd/MM/yyyy"];
[formatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

NSDate * start = [formatter dateFromString:@"01/05/2005"];
NSDate * end = [formatter dateFromString:@"01/06/2005"];    

NSInteger month = [[[NSCalendar currentCalendar] components: NSMonthCalendarUnit fromDate: start toDate: end options: 0] month];
NSLog(@"%@, %@ --> difference: %d", start, end, month);
0 голосов
/ 06 апреля 2011

Ты этого не делаешь, и ты должен быть ...

NSDate *start = [NSDate date];
NSDate *end = [NSDate date];

NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];  
start = [dateFormatter dateFromString:@"01-05-2005"];
end = [dateFormatter dateFromString:@"01-06-2005"];

NSInteger month = [[[NSCalendar currentCalendar] components: NSMonthCalendarUnit fromDate: start toDate: end options: 0] month];
NSLog(@"%i", month);
0 голосов
/ 06 апреля 2011

Звучит так, будто ваш ввод неверно истолкован. Как вы создаете начальный и конечный объекты? Вы убедились, что ваши входные данные интерпретируются как дд / мм / гггг, как вы и предполагали, а не мм / дд / гггг?

Если первый компонент ('01' для начала и конца) интерпретируется как месяц, а не как день, разница в 0 будет совершенно правильной. Кроме того, использование «02» в конечной дате будет (опять же, правильно) вести себя так, как вы описали, если это так.

0 голосов
/ 06 апреля 2011

Это сработало для меня, но я не дал слишком много информации о том, является ли это лучшим решением:

NSDate* dateA; // alloc and init
NSDate* dateB; // alloc and init

NSCalendar *sysCalendar = [NSCalendar currentCalendar];
unsigned int unitFlags = NSSecondCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit;

NSDateComponents *difference= [sysCalendar components:unitFlags fromDate: dateA toDate:dateB  options:0];

double hour = [difference hour];
double minute = [difference minute];
double second = [difference second];

Моя цель здесь состояла в том, чтобы игнорировать что-либо выше часа.Вот почему я установил флаг NSDayCalendarUnit.Если вы установите NSMonthCalendarUnit-flag (?), Он должен предоставить вам всего месяцы, а не только месяц dateA - месяц dateB.

Редактировать: я получил это из другого потока, но не смог выяснитьчто, так что спасибо, кто бы ни предоставил мне этот кусок кода:)

0 голосов
/ 06 апреля 2011

Но разница составляет 0 месяцев, так как это тот же месяц. Если вы предпочитаете представлять тот же месяц как один, а следующий месяц как 2, можете ли вы просто добавить 1 к результату?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...