NSDate возвращает неверную дату первого числа месяца - PullRequest
5 голосов
/ 06 июля 2011

Мое приложение использовало функцию [NSDate date] для получения текущей даты.Его работа хорошо в другие дни, кроме 1-го числа каждого месяца в течение AM .т.е. выполните следующие шаги:

  1. Установите системную дату как 01 - июнь - 2011 и время между 00:00 полуночи и 5,59.
  2. Используйте следующий код:
    NSLog(@"Current Date :: %@",[NSDate date]);

O / P: :: Текущая дата :: 2011-05-31 19:40:21 + 0000

Желаемое O / Pis :: Текущая дата :: 2011-06-01 00: 00: 0 (то есть установленное время) + 0000

Также с 6 AM все работает нормально.

В чем причина этого?

На самом деле я не хочу NSDate в строковом формате, но мне нужен объект даты NSDate, соответствующий 1-й дате текущего месяца.Для которого я использую следующий фрагмент кода:

NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

NSDateComponents *comp = [gregorian components:(NSYearCalendarUnit | NSMonthCalendarUnit 
| NSDayCalendarUnit) fromDate:[NSDatedate]];

[comp setDay:1];     

NSDate *firstDayOfMonthDate = [gregorian dateFromComponents:comp];

[gregorian release];

return firstDayOfMonthDate;

Поскольку [дата NSDate] возвращает неправильную дату, компоненты также содержат неправильную дату.Приведенный выше код работает для всех senario, кроме senario, который я разместил в начале этой темы.Что я должен делать?

Ответы [ 2 ]

2 голосов
/ 27 июля 2011

Наконец-то получили решение:

Дело в том, что NSDate-объектам не присвоен часовой пояс , и в нескольких выпусках кто-то из Apple решил, что метод -Description NSDate, который использует NSLog, должен использовать GMT +0, а НЕ местный часовой пояс для вывода. (Я предполагаю, что у кого-то была ошибка, из-за которой они повредили настройку локали, и это вызвало сбой метода -Description NSDate, и поэтому сообщения об ошибках были поданы ...)

Краткая версия: Используйте NSDateFormatter для вывода дат. Не используйте -описание .

0 голосов
/ 06 июля 2011

Вы используете iOS версии 4.2? Если это так, то у метода date есть какая-то проблема, похоже, он не соответствует вашему местному часовому поясу. Например, если я запускаю ваш код в симуляторе iOS 4.0, я получаю следующий вывод:

Current Date :: 2011-07-06 10:43:38 -0400

Но если я запускаю его в симуляторе iOS 4.2, я получаю следующее:

Current Date :: 2011-07-06 14:44:18 +0000

Вот еще один SO пост, который описывает это более подробно:

NSDate и другие проблемы на iOS 4.2

Если вы просто ищете текущую дату и время в строке NSString, я использую код, который выглядит следующим образом, для выполнения этой задачи:

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setFormatterBehavior:NSDateFormatterBehavior10_4];
[formatter setDateStyle:NSDateFormatterShortStyle];
[formatter setTimeStyle:NSDateFormatterShortStyle];
NSString *result = [formatter stringFromDate:[NSDate date]];
[formatter release];
NSLog(@"Current Date v2 :: %@",result);
...