Подтвердить что ты не робот

Анализ даты/времени в 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.

4b9b3361

Ответ 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, который вы можете прочитать здесь здесь.