Как преобразовать дату UTC в NSDate?

У меня есть строка в формате UTC, и я хотел бы преобразовать ее в NSDate.

static NSDateFormatter* _twitter_dateFormatter;
[_twitter_dateFormatter setFormatterBehavior:NSDateFormatterBehaviorDefault];
[_twitter_dateFormatter setDateFormat:@"EEE MMM dd HH:mm:ss ZZZ yyyy"];
[_twitter_dateFormatter setLocale:_en_us_locale];

NSDate *d = [_twitter_dateFormatter dateFromString:sDate];

Когда я просматриваю отладчик, d равен нулю, хотя sDate равен «2010-03-24T02:35:57Z».

Не совсем уверен, что я делаю неправильно.


person Sheehan Alam    schedule 24.03.2010    source источник
comment
Также небольшая придирка: d равно nil в отладчике, а не *d (вы не можете разыменовать нулевой указатель).   -  person Alan Rogers    schedule 24.03.2010
comment
На самом деле ваша строка не является UTC. Ваше строковое значение 'sDate' представляет собой стандартный формат (RFC 3339 или ISO 8601), представляющий дату и время в часовом поясе Zulu (UTC) ("Z" в конце).   -  person Basil Bourque    schedule 30.09.2012


Ответы (3)


То же самое касается необходимости выделить/инициализировать ваш объект NSDateFormatter, но у вас есть и другая проблема: ваша строка формата даты не соответствует фактической дате, которую вы ей даете.

"EEE MMM dd HH:mm:ss ZZZ yyyy"
- vs -
"2010-03-24T02:35:57Z"

Эта строка формата будет соответствовать чему-то вроде:

"Wed Mar 24 00:07:33 -0400 2010"

См. стандарт Unicode, чтобы узнать значение строки формата даты.

person David Gelhar    schedule 24.03.2010
comment
Спасибо, что указали на несоответствие. Я не уверен, как я могу отформатировать строку, чтобы она выглядела как 2010-03-24T02:35:57Z - person Sheehan Alam; 24.03.2010
comment
Аналогичный вопрос stackoverflow.com/questions/1263455/ В частности, обратите внимание на предложение заменить конечный Z во входной строке явным числовым часовым поясом ( -0000) - person David Gelhar; 24.03.2010
comment
Спасибо! В моем случае формат даты должен быть yyyy-MM-dd'T'HH:mm:ssZ Замена Z на (-0000) помогла. - person Sheehan Alam; 24.03.2010

Вы не выделяете и не инициализируете свой объект NSDateFormatter.

Попробуйте что-то вроде этого:

NSDateFormatter* _twitter_dateFormatter = [[NSDateFormatter alloc] init];
[_twitter_dateFormatter setFormatterBehavior:NSDateFormatterBehaviorDefault];
[_twitter_dateFormatter setDateFormat:@"EEE MMM dd HH:mm:ss ZZZ yyyy"];
[_twitter_dateFormatter setLocale:_en_us_locale];

NSDate *d = [_twitter_dateFormatter dateFromString:sDate];
[_twitter_dateFormatter release];

Также непонятно, почему вы объявляете _twitter_dateFormatter статическим. Если вы пытаетесь избежать его перераспределения, сделайте его иваром вашего класса.

person Alan Rogers    schedule 24.03.2010

Apple предоставляет исходный код для анализа даты и времени RFC 3339 . Если вы используете ARC, вы можете настроить этот источник, удалив вызовы «autorelease».

К вашему сведению, RFC 3339 является частью ISO 8601 с одним отклонением (отрицательное смещение нуля разрешено в RFC 3339). Таким образом, код Apple убивает двух зайцев одним выстрелом, обрабатывая дату и время в так называемом «интернет-стиле» RFC 3339, а также простые даты и время ISO 8601.

person Basil Bourque    schedule 29.09.2012