我尝试了一个实验,因为我需要能够在我正在处理的应用程序中生成一个unix时间戳(自1970年以来)。
NSLog(@"Getting timeIntervalSince1970");
double theLoggedInTokenTimestampDateEpochSeconds = [[NSDate date] timeIntervalSince1970];
此应该返回格林尼治标准时间(自1970年以来)的时间秒(自1970年1月1日以来的秒数)。但是,在2011年8月15日星期一09:54:30进行实验时,它返回1313427270.504315
在Mac OS终端上使用简单的perl单行测试,我得到:
perl -e 'print scalar(localtime(1313427270))'
返回 2011年8月15日星期一09:54:30 ...
这显然不是格林威治标准时间,当我在旧金山湾区,我的当地时区设置为“库比蒂诺”。发生了什么事,我该如何解决?我需要让我的应用程序在通信时将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];
这很好用 - 在用户的时区和区域设置中显示更正的时间...所以我知道它正在为传入的时间戳做。那么,第一个阻止它进入GMT的函数(timeIntervalSince190)我做错了什么?
THX
答案 0 :(得分:4)
我不认为第一个功能实际上是错误的,尽管表面上可能看起来像它。从timeIntervalSince1970收到的时间间隔 NOT 返回GMT中的时间间隔。相反,它返回从现在到1970年1月1日00:00:00 GMT之间的时间间隔。这看起来像是挑剔,但重要的是:间隔值不过是固定时间点以来的标量秒数。区间本身不是GMT,只有它的固定参考点是。
我不知道perl,但我快速搜索当地时间的文档,似乎需要花费时间并将标准日期类型打印转换为当地时间。这意味着您描述固定时间点的时间间隔将转换回当时的当地时间。当您从命令行显示它时,您将再次获得本地时间。所以看到翻译到当地时间的绝对时间是我期望看到的。
根据您的服务预计接收UTC时间的准确程度,您的时间间隔值可能正常工作。您是否有证据表明它不是基于您的终端检查以外的其他东西?