Возвращает ли [NSDate date] местную дату и время? - PullRequest
6 голосов
/ 07 марта 2011

Я тупой?Все это время я думал, что [дата NSDate] вернула местную дату и время.После некоторых проблем с NSStringformatter / stringFromdate / dateFromString сегодня я заметил, что мой [дата NSDate] возвращался 2011-03-06 11:00:00 +0000.После изучения этого я вижу, что [NSDate date] возвращает необработанную дату, которая всегда равна GMT.

Какой цели служит часть смещения gmt, если она всегда показывает +0000?Также я не понимаю [описание myDate].В документах говорится, что он должен отображать смещение gmt, а также информацию dst.Я получаю то же самое, что и [дата NSDate].

Итог для меня, если я использую [NSDate date], чтобы получить текущую дату, и это после 14:00, я получаю завтрашнюю дату, поскольку я нахожусь в часовом поясе -10.Не говоря уже о проблемах, с которыми я столкнулся сегодня с NSDateformatter.

Я правильно вижу?Забавно, но мне кажется, что я помню, как возвращался [дата NSDate] 2011-03-06 11:00:00 -36000, или я думал, что видел 2011-03-06 11:00:00 -10000.

Я могу с этим поработать, но, может быть, кто-нибудь излагает это, чтобы помочь мне лучше понять NSDate.

Ответы [ 2 ]

20 голосов
/ 07 марта 2011

NSDate возвращает текущую дату.Хотя он может конвертировать в и из строкового формата в разных локалях / часовых поясах, NSDate не имеет внутренней концепции часового пояса.NSDates не привязаны к какому-либо конкретному региону.Если вы и кто-либо еще в мире попросите ваши устройства одновременно [дата NSDate], вы получите равные результаты - не потому, что он всегда возвращается в GMT, а потому, что он не возвращается в зависимости от часового пояса.В Какао дата - это особый момент в истории Земли.То, как вы пишете дату, связано с вашим календарем, вашим часовым поясом и вашей локалью.

Вы не получаете завтрашнюю дату, вы получаете правильную дату, а затем замечаете, что она дает другой день, если выражено вВРЕМЯ ПО ГРИНВИЧУ.Это правильная дата, просто написанная не так, как вы хотели бы.

'description' - это метод, переопределенный из NSObject.Когда вы NSLog объекта, внутренне происходит то, что вызывается метод description и выводится возвращаемая строка.Таким образом, вы должны получить идентичные результаты при ведении журнала object и [object description], так как первый вызывает описание и печатает эту строку, последний вызывает описание, затем вызывает описание полученной строки и печатает ее.NSStrings возвращают себя как результат описания.

Это должно быть поведение по умолчанию, но чтобы получить содержательное описание, попробуйте:

NSLog(@"%@", [[NSDate date] descriptionWithCalendarFormat:nil 
           timeZone:[NSTimeZone localTimeZone] locale:[NSLocale currentLocale]]);

Если это все еще входит в систему по Гринвичу, тогда ваше устройство считает себябыть в GMT.Я понятия не имею, насколько надежен симулятор в таких вещах.

0 голосов
/ 08 апреля 2015

In Swift :

NSDate () дает нам описание даты с независимой статистикой, всегда возвращает время даты UTC + 0, независимо от часового пояса устройства:

print(NSDate())

.descriptionWithLocale (NSLocale.currentLocale ())! дает нам описание локализованной даты UTC + N время даты, где N представляет смещение (положительное или отрицательное) между UTC +0 и текущее местное время:

print(NSDate().descriptionWithLocale(NSLocale.currentLocale())!)
...