Проблемы с [дата NSD] и високосным годом - PullRequest
1 голос
/ 01 марта 2012

В високосный год [NSDate date] возвращает 2012-03-01 HH:MM:SS +TTTT.

В stackoverflow я часто видел сообщения, в которых сегодняшняя дата получается простым вызовом [NSDate date].Проблема в том, что в високосный год это не вернет правильную дату.Теперь я понимаю, что високосный год на самом деле является функцией календарной системы, поэтому имеет смысл, что NSDate не будет распознавать високосный год (или летнее время в этом отношении).Однако это может привести к разрушению кода - например:

скажем, что вы назначаете дату изменения файла, выполняя:

// assume today's date is 2012-02-29 10:00:00 +0000
NSDate *fileModificationDate = [NSDate date];    // 2012-03-01 10:00:00 +0000 is returned

Затем в какой-то момент в будущем вы сделаетеСравнение, чтобы увидеть, когда файл был последний раз изменен:

// assume it's the next day at 9 AM, ie 2012-03-01 09:00 +0000
NSTimeInterval timeSinceLastModification = [fileModificationDate timeIntervalSinceNow];

Возвращенный timeSinceLasModification будет положительным, означая время в будущем, которое не имеет смысла!

Мои вопросы: естьна самом деле плохая практика использовать [NSDate date] для получения текущей даты?Я что-то упустил здесь?

Извините за длинный вопрос ...

1 Ответ

8 голосов
/ 01 марта 2012

Я не знаю, откуда у вас мысль, что NSDate не поддерживает високосный день, но это абсолютно неправильно. Я полагаю, что вы запутались, потому что сейчас в GMT строка даты - 2012-03-01 03:42:07 +0000. Это правильно . В GMT уже 1 марта. Но если вы спросите дату в текущей локали (например, [[NSDate date] descriptionWithLocale:[NSLocale currentLocale]]), вы получите правильное значение високосного дня. Для меня в PST это

Среда, 29 февраля 2012 г. 19:42:46 Тихоокеанского стандартного времени

Обратите внимание, что NSDate сам по себе не знает локали. Единственное изменение, которое я сделал, - попросил его вернуть строковое представление, используя текущий языковой стандарт вместо использования GMT. Я мог бы взять тот же объект даты и запросить EST, и он также дал бы мне правильную строку для этого часового пояса.

...