Я попробовал эксперимент, потому что мне нужно иметь возможность генерировать временную метку 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?
Спасибо
1313427270.504315
— это количество секунд с 1 января 1970 года по Гринвичу, и это абсолютная мера, которая не зависит от того, в каком часовом поясе вы находитесь. Это соответствует2011-08-15 16:54:30
по Гринвичу и2011-08-15 09:54:30
в Калифорнии. Оба являются разными представлениями одного и того же момента. - person albertamg   schedule 15.08.2011