Лучший способ синхронизировать время iPhone с сервером

У меня есть модель клиент-сервера, где сервер будет отправлять некоторые данные с параметрами даты, и iPhone должен будет их отобразить. Сервер и iPhone будут находиться в разных часовых поясах. Поэтому мне нужно синхронизировать время в обоих. Предположим, что пользователь совершил какую-либо активность в «18.07.2011/04/45/EDT» (время сервера). Со стороны iPhone мне нужно преобразовать эту строку даты в объект NSDate.

Каков наилучший способ добиться этого.

Спасибо


person Dilshan    schedule 18.07.2011    source источник
comment
Лучший способ — всегда использовать временные метки UTC внутри и переводить в тот или иной часовой пояс только при отображении данных пользователю. Пожалуйста, не позволяйте вашему серверу генерировать или отправлять метки времени в EDT.   -  person aroth    schedule 18.07.2011
comment
Хорошо, скажем, вместо этого сервер отправляет 18.07.2011/04/45/UTC, будет ли это свойство преобразовано в объект NSDate? Должны ли мы предполагать, что время сервера равно GMT +0000 или оно неявно преобразуется в правильный объект NSDate?   -  person Dilshan    schedule 18.07.2011
comment
Вы можете попробовать метод dateWithString: NSDate. Если он возвращает (null), введенная строка несовместима.   -  person Pripyat    schedule 18.07.2011
comment
Спасибо, Дэвид. Я думаю, что это должно быть NSDateFormatter dateWithString. Я хочу знать, будет ли это 18.07.2011/04/45/UTC правильно называться исходя из этого. Пожалуйста, смотрите мой комментарий выше.   -  person Dilshan    schedule 18.07.2011


Ответы (3)


Извините за поздний ответ, просто искал «NSDate Sync to Server» в Google и попал сюда. Я застрял с той же проблемой и написал эту милую маленькую категорию, которая помогает.

Он может вернуть объект NSDate, синхронизированный с любым веб-сервером, с помощью только одного HTTP-запроса (за сеанс).

https://github.com/freak4pc/NSDate-ServerDate

Если у вас есть какие-либо вопросы, не стесняйтесь, дайте мне знать.

person Shai Mishali    schedule 02.10.2013

Если вы хотите, чтобы время на сервере и клиенте было одинаковым, синхронизируйте оба с NTP (протокол сетевого времени). Клиент obj-c ntp доступен по адресу http://code.google.com/p/ios-ntp/source/browse/trunk/ntpA.xcodeproj/project.pbxproj?spec=svn25&r=25.

Как было предложено выше, Away сохраняет/отправляет время в виде временных меток unix (секунды с эпохи UTC) и при необходимости преобразует их в часовые пояса.

person TomL    schedule 19.07.2011

Вы можете определенно добиться этого следующим образом:

1) Когда вы впервые извлекаете данные с сервера, передайте значение даты как «» (пусто). Таким образом, сервер определит, что пользователю требуются все данные.

2) В приведенном выше сервисе добавьте тег «Дата» в веб-сервис сервера. Таким образом, когда вы получаете другие данные, вы также можете получить дату сервера. Итак, сохраните эту дату сервера в файле local.

3) В следующий раз, когда вы получите другие данные, передайте эту сохраненную дату (которая будет в формате сервера и часовом поясе), чтобы сервер предоставил вам только те данные, которые были добавлены или изменены после этих данных.

4) Таким образом, вы можете решить проблему с датой. А также не будет проблем с местным временем или часовым поясом.

Пожалуйста, ознакомьтесь с пунктом выше и дайте мне знать в случае каких-либо затруднений.

Я реализовал это в большинстве своих приложений, и он работает нормально.

Для даты UTC вы можете использовать следующую функцию:

-(NSString *)getUTCFormateDate
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:@"UTC"];
    [dateFormatter setTimeZone:timeZone];
    [dateFormatter setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
    NSString *dateString = [dateFormatter stringFromDate:[NSDate date]];
    //NSLog(@"UTC Date = %@",dateString);

    return dateString;
}

Я надеюсь, это будет полезно для вас.

Спасибо.

person Nishant B    schedule 18.07.2011
comment
Спасибо, Нишант. Но мне также нужна информация о старой дате :(. Каким-то образом мне нужно убедиться, что 18.07.2011/04/45/UTC является GMT +0000 или он неявно преобразован в правильный объект NSDate (кроме GMT ​​+0000). - person Dilshan; 18.07.2011
comment
Привет, Дилшан, собственно, зачем тебе конвертировать дату? Потому что это будет просто решить процесс синхронизации. Таким образом, вы можете иметь правильные данные на основе даты сервера. Пожалуйста, дайте мне знать, что такое старая информация о дате, и она вам нужна? - person Nishant B; 18.07.2011
comment
Его, чтобы получить квитанцию, информацию об истории заказа и т. д. - person Dilshan; 18.07.2011
comment
Привет, Дилшан, для этого ты должен знать формат даты сервера. И используйте NSDateFormatter с форматом, например EEE, dd MMM yyyy hh:mm:ss zzzz. Может быть, это будет полезно для вас. Спасибо. - person Nishant B; 19.07.2011
comment
Это то, что я делаю сейчас. Но аббревиатуры типа EST/EDT не будут работать. Это должно быть UTC. Поэтому я поднял выше вопрос. - person Dilshan; 19.07.2011
comment
Привет, я обновил свой ответ. При этом вы получите функцию, которая будет возвращать данные формата UTC текущей даты. Надеюсь, это будет полезно для вас. - person Nishant B; 19.07.2011