NSDate dateWithTimeIntervalSince1970 НЕ возвращает время по Гринвичу / UTC - PullRequest
0 голосов
/ 15 августа 2011

Я попробовал эксперимент, потому что мне нужно иметь возможность генерировать метку времени Unix (с 1970 года) в приложении, над которым я работаю.

NSLog(@"Getting timeIntervalSince1970");
    double theLoggedInTokenTimestampDateEpochSeconds = [[NSDate date] timeIntervalSince1970];

Этот должен был возвращать эпохальные секунды (с 1970 г.) по Гринвичу (секунды с 1 января 1970 г.).Однако при проведении эксперимента в понедельник, 15 августа, 09:54:30, он вернул 1313427270.504315

При тестировании с помощью простого однострочного perl на моем терминале Mac OS я получаю: perl -e 'print scalar(localtime(1313427270))', который возвращает Пн. 15 августа 09:54:30 2011 ...

Очевидно, что это не время по Гринвичу, когда я нахожусь в районе залива SF, и мой местный часовой пояс установлен на "Купертино".Что происходит и как мне это исправить, пожалуйста?Мне нужно, чтобы мое приложение отправляло время UTC на сервер, когда оно обменивается данными, поэтому, где бы ни находился пользователь, отметка времени будет отправлена ​​в одном равном действительном часовом поясе.

В другой части моего приложения, когда пользователь запрашиваетданные с сервера отправляются в UTC - преобразование для отображения следующим образом:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[NSLocale currentLocale]];
    [dateFormatter setTimeZone:nil];
    [dateFormatter setDateFormat:@"yyyyMMdd"];
    NSDate *conversationDate = [NSDate dateWithTimeIntervalSince1970:[theConversationTimeStampString intValue]];
    NSString *conversationDateString = [dateFormatter stringFromDate:conversationDate];
    [dateFormatter release];

, и это прекрасно работает - отображение скорректированного времени в часовом поясе и локали пользователя ... такЯ знаю, что это делается для входящих меток времени.Итак, что я делаю не так с первой функцией (timeIntervalSince190), которая не позволяет ей быть в GMT?

Thx

1 Ответ

4 голосов
/ 15 августа 2011

Я не думаю, что первая функция на самом деле неверна, хотя может показаться, что она выглядит на поверхности.Интервал времени, который вы получаете от timeIntervalSince1970, равен NOT , возвращая временной интервал в GMT.Скорее, он возвращает временной интервал между сейчас и 1 января 1970 года 00:00:00 по Гринвичу.Это может показаться ничтожным, но это важно: значения интервала не более чем скалярное число секунд с фиксированной точки времени.Сам интервал не по Гринвичу, только его фиксированная контрольная точка.

Я не знаю Perl, но я быстро выполнил поиск документации по местному времени, и, кажется, он занимает какое-то время и печатаетстандартный тип даты по местному времени.Это означает, что ваш интервал времени, описывающий фиксированный момент времени, конвертируется обратно в ваше местное время в этой точке.Когда вы выводите его из командной строки, вы снова получаете местное время.Таким образом, я могу ожидать увидеть абсолютное время, переведенное в ваше местное время.

В зависимости от того, как именно ваша служба ожидает получить время UTC, значение вашего временного интервала, скорее всего, будет работать нормально.У вас есть доказательства того, что это не основано на чем-то кроме проверки вашего терминала?

...