NSDate dateWithTimeIntervalSince1970不返回GMT / UTC时间

时间:2011-08-15 17:08:28

标签: ios sdk nsdate utc gmt

我尝试了一个实验,因为我需要能够在我正在处理的应用程序中生成一个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

1 个答案:

答案 0 :(得分:4)

我不认为第一个功能实际上是错误的,尽管表面上可能看起来像它。从timeIntervalSince1970收到的时间间隔 NOT 返回GMT中的时间间隔。相反,它返回从现在到1970年1月1日00:00:00 GMT之间的时间间隔。这看起来像是挑剔,但重要的是:间隔值不过是固定时间点以来的标量秒数。区间本身不是GMT,只有它的固定参考点是。

我不知道perl,但我快速搜索当地时间的文档,似乎需要花费时间并将标准日期类型打印转换为当地时间。这意味着您描述固定时间点的时间间隔将转换回当时的当地时间。当您从命令行显示它时,您将再次获得本地时间。所以看到翻译到当地时间的绝对时间是我期望看到的。

根据您的服务预计接收UTC时间的准确程度,您的时间间隔值可能正常工作。您是否有证据表明它不是基于您的终端检查以外的其他东西?