Анализ даты/времени в iOS: как обрабатывать (или не обрабатывать) временные интервалы?
У меня есть веб-сайт ASP.NET MVC 3, который взаимодействует с моим приложением iOS через JSON. Как часть объектов, отправленных в ответ JSON, у меня есть даты в формате yyyy-MM-dd HH:mm:ss ZZZ
, который выводит 2011-04-05 16:28:22 -07:00
. Как разобрать это в iOS?
Это код, с которым я сейчас возился:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZ"];
[dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
NSDate *date = [dateFormatter dateFromString:@"2011-04-05T16:28:22-0700"];
NSLog(@"%@; %@; %@", dateFormatter, date, [NSTimeZone localTimeZone]);
Прежде всего следует отметить, что 2011-04-05 16:28:22 -07:00
должен выглядеть как 2011-04-05T16:28:22-0700
, где T
заменяет первое пространство (при условии, что это означает время или где начинается часть времени строки?), второе место удаляется и удаляется двоеточие в часовом поясе. Я полагаю, что найду способ отформатировать строку, которую .NET отправляет обратно, чтобы соответствовать строке, которую будет обрабатывать iOS.
Реальная проблема заключается в том, что дата, которая выводится, на 7 часов превышает то, что я отправил в ответ JSON. Итак, iOS выводит 2011-04-05 16:28:22 -07:00
как 2011-04-05 23:28:22 +0000
, и это неверно в отношении моего приложения.
Единственное решение, которое я нашел до сих пор, - отправить дату в JSON как 2011-04-05 16:28:22 +00:00
, но это опять неверно, потому что я изменяю, какова должна быть настоящая дата.
В любом случае, я был бы признателен за то, что кто-то взглянул и дал мне понять, как я могу разобрать строку даты .NET, выводимую через формат yyyy-MM-dd HH:mm:ss ZZZ
(который, я полагаю, можно переписать на yyyy-MM-ddTHH:mm:ssZZZ
) на NSDate
объект, который я могу использовать в iOS.
Ответы
Ответ 1
Я не знаю, как это правильно, но я в конечном итоге обнаружил, что в .NET мне нужно сделать DateTime.ToUniversalTime().ToString("yyyy-MM-ddHH:mm:ss")
, а на стороне iOS я должен это сделать:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
[dateFormatter setDateFormat:@"yyyy-MM-ddHH:mm:ss"];
NSDate *date = [dateFormatter dateFromString:@"2011-04-0600:28:27"];
Только тогда дата правильная, когда NSLog
выводится, поэтому я предполагаю, что я наконец получил правильную дату/время.
Ответ 2
Ваш код синтаксиса даты iOS верен: 2011-04-05 16:28:22 -07:00
и 2011-04-05 23:28:22 +0000
представляют одно и то же время, только в разных часовых поясах. Единственная проблема заключается в том, что NSDate фактически не хранит часовой пояс, поэтому [date description]
выводит с использованием UTC.
Ответ 3
Вам почти наверняка лучше всего использовать время UTC везде для обмена и не беспокоить часовые пояса. Я уверен, что вы можете получить этот код ASP.NET, чтобы это сделать, и легче разбираться на принимающей стороне. NSDateFormatter использует стандартный синтаксис форматирования даты Unicode, который вы можете прочитать здесь здесь.