Требуется решение для преобразования и сохранения даты / времени в правильном местном времени по сравнению с часовым поясом устройства - PullRequest
1 голос
/ 05 сентября 2010

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

Мне нужно хранить некоторые расписания на сервере (Ruby on Rails) с iPhone.На устройстве iPhone время соответствует настройкам часового пояса устройства, но на сервере мне нужно правильно хранить данные в локальном часовом поясе серверов, чтобы запланированное событие было запущено в нужное время.

MyИдея заключалась в следующем: - Преобразование времени iPhone в часовой пояс UTC и отправка на сервер. - На сервере считайте все сохраненные временные метки как часовой пояс UTC. - Для данных, полученных с сервера, конвертируйте время из часового пояса UTC в местное время часового пояса

.Вот мой код для преобразования во время UTC:

// First the NSDateformatter
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    NSLocale *enUSPOSIXLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"] autorelease];
    [dateFormatter setLocale:enUSPOSIXLocale];
    [dateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];

// Now the conversion from local timezone to UTC
    NSTimeZone *srcTimeZone = [NSTimeZone timeZoneWithAbbreviation:@"UTC"];
    NSTimeZone *destTimeZone = [NSTimeZone systemTimeZone];
    NSInteger sourceGMTOffset = [srcTimeZone secondsFromGMTForDate:srcDate];
    NSInteger destinationGMTOffset = [destTimeZone secondsFromGMTForDate:srcDate];
    NSTimeInterval interval = destinationGMTOffset - sourceGMTOffset;
    NSDate *destDate = [[[NSDate alloc] initWithTimeInterval:interval sinceDate:srcDate] autorelease];

Проблема в том, что если я попытаюсь изменить часовой пояс на моем iPhone между двумя сообщениями на сервер, будет разница во времени, поэтому что-тонеправильно.

Итак, мой вопрос (ы): 1) Это хороший подход?2) Что не так с моим кодом?

Спасибо, Сёрен

1 Ответ

1 голос
/ 05 сентября 2010

Вы не должны возиться с часовыми поясами, за исключением пользовательского интерфейса.

Вместо этого вы должны сохранять все свои времена, используя timeIntervalSinceReferenceDate, который является примитивным методом NSDate, который возвращает количество прошедших секунд в микросекундах, прошедшее с 1 января 2001 года по Гринвичу, а также текущую дату и время по Гринвичу. Сохраните это число на сервере, а затем вы можете преобразовать его в даты с часовыми поясами, необходимыми для отображения.

Программирование данных и времени обманчиво сложно. Держите все как можно более простым и фиксированным в основной логике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...