2011-08-15 68 views
0

我试过一个实验,因为我需要能够在我正在处理的应用程序中生成unix时间戳(自1970年以来)。NSDate dateWithTimeIntervalSince1970不返回GMT/UTC时间

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

应(自1970年1月1日秒)格林尼治标准已经返回划时代秒(自1970年)。然而,在周一在8月15日九点54分30秒2011在进行实验时,它返回1313427270.504315

测试这与我的Mac OS终端一个简单的Perl的一行,我得到: 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

+3

'1313427270.504315'是自1970年1月1日以来的秒数,格林威治标准时间,这是一个不依赖于你是哪个时区的绝对度量。它对应于格林尼治标准时间的“2011-08-15 16:54:30”和加州的“2011-08-15 09:54:30”。两者都是*同一时刻*的不同表示。 – albertamg

回答

4

我不认为第一个功能其实是错误的,尽管它可能看起来像它表面上。您从timeIntervalSince1970接收的时间间隔是而不是以GMT格式返回时间间隔。而是从现在到1970年1月1日00:00:00格林尼治标准时间之间的时间间隔返回。这看起来像是一个挑剔的问题,但它很重要:间隔值只不过是一个固定时间点以来的标量秒数。间隔本身不是格林尼治标准时间,只有其固定的参考点是。

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

根据您的服务期望接收UTC时间的精确程度,您的时间间隔值很可能正常工作。你有证据证明它不是基于你的终端检查之外的东西吗?

+2

所以,这是我的不好。我正在使用标量(localtime(1313427270))。我应该使用标量(gmtime(1313427270))。那会给我那个时间戳的perl GMT版本。谢谢,蒂姆! – Jann