NSDate dateWithTimeIntervalSince1970 НЕ возвращает время GMT/UTC

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

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

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

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

Это явно не время по Гринвичу, когда я нахожусь в районе залива Сан-Франциско, а мой местный часовой пояс установлен на «Купертино». Что происходит и как это исправить, пожалуйста? Мне нужно, чтобы мое приложение отправляло время 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?

Спасибо


person Jann    schedule 15.08.2011    source источник
comment
1313427270.504315 — это количество секунд с 1 января 1970 года по Гринвичу, и это абсолютная мера, которая не зависит от того, в каком часовом поясе вы находитесь. Это соответствует 2011-08-15 16:54:30 по Гринвичу и 2011-08-15 09:54:30 в Калифорнии. Оба являются разными представлениями одного и того же момента.   -  person albertamg    schedule 15.08.2011


Ответы (1)


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

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

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

person Tim Dean    schedule 15.08.2011
comment
так что это было мое плохо. я использовал скаляр (местное время (1313427270)). Я должен был использовать скаляр (gmtime (1313427270)). Это дало бы мне версию Perl GMT этой метки времени. Спасибо, Тим! - person Jann; 17.08.2011