NSDateComponents проблема - неправильный день - PullRequest
4 голосов
/ 04 августа 2011

У меня проблема с NSDateComponents. У меня есть две даты NSD, которые я пытаюсь сравнить, проверяя, совпадают ли их год, месяц и день. Это я делаю путем преобразования значений NSDate в эти целочисленные компоненты следующим образом:

//NSDate *cgiDate is previously set to 2011-08-04 00:00:00 +0000 
//NSDate *orderDate is previously set to 2011-08-04 14:49:02 +0000
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *cgiDateComponents = [calendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) fromDate:cgiDate];
NSCalendar *orderCalendar = [NSCalendar currentCalendar];
NSDateComponents *orderDateComponents = [orderCalendar components:( NSYearCalendarUnit | NSMonthCalendarUnit |  NSDayCalendarUnit ) fromDate:orderDate];
if (([cgiDateComponents day] == [orderDateComponents day]) &&
    ([cgiDateComponents month] == [orderDateComponents month]) &&
    ([cgiDateComponents year] == [orderDateComponents year])) {
       GHTestLog(@"MATCHED");
 } else {
       GHTestLog(@"Not matched");
       GHTestLog(@"Day: %d vs. %d", [cgiDateComponents day], [orderDateComponents day]);
 }

Мой результат не соответствует, День: 3 против 4. Почему это будет?

Я с большим интересом прочитал следующие вопросы: NSDateComponents - дневной метод, возвращающий неправильный день и https://stackoverflow.com/questions/3920445/nsdatecomponents-incorrectly-reporting-day однако ни один не отвечает на мой вопрос, почему это не работает.

Любой совет?

Ответы [ 3 ]

6 голосов
/ 05 августа 2011

Я думаю, что проблема заключается в следующем: Ваши даты установлены в часовом поясе GMT ​​(+0000) Если вы находитесь в США, например, на GTM-6, то к -currentCalendar первая дата будет 6 вечера 3 августа, а вторая - 8:49 4 августа.

Вы должны заставить свой календарь иметь часовой пояс UTC (GMT) или указывать даты в своем часовом поясе, в зависимости от того, что подходит для вашего приложения.

2 голосов
/ 05 августа 2011

Похоже, у вас проблема с часовым поясом.Хотя ваши даты установлены в часовом поясе +0000, ваш звонок [NSCalendar calendar], скорее всего, вернет вам календарь для вашего местного часового пояса.Учитывая корректировку по местному времени, orderDate вероятнее всего на следующий день.Вручную установите для своих календарей часовой пояс + 0000.

1 голос
/ 05 августа 2011

NSDate имеет функцию isEqualToDate :.так что то, что вы пытаетесь сделать, может быть сделано:

[datea isEqualToDate:dateb];

также имеется функция Compare:, которая возвращает порядок дат.

edit: I'm nowПомните, что это не отвечает на ваш вопрос о том, почему дни возвращают разные значения, если они установлены одинаково.Сожалею!это все еще может помочь сделать ваш код немного чище.

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