NSDate dateWithTimeIntervalSince1970 不返回 GMT/UTC 时间

Posted

技术标签:

【中文标题】NSDate dateWithTimeIntervalSince1970 不返回 GMT/UTC 时间【英文标题】:NSDate dateWithTimeIntervalSince1970 NOT returning GMT/UTC time 【发布时间】:2011-10-27 10:35:38 【问题描述】:

我尝试了一个实验,因为我需要能够在我正在开发的应用程序中生成一个 unix 时间戳(自 1970 年以来)。

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

应该返回 GMT 的纪元秒数(自 1970 年以来)(自 1970 年 1 月 1 日以来的秒数)。但是,在 2011 年 8 月 15 日星期一 09:54:30 进行实验时,它返回了 1313427270.504315

在我的 Mac OS 终端上使用简单的 perl 单行程序对此进行测试,我得到: perl -e 'print scalar(localtime(1313427270))' 返回 Mon Aug 15 09:54:30 2011 ...

当我在旧金山湾区并且我的本地时区设置为“库比蒂诺”时,这显然不是 GMT 时间。请问这是怎么回事,我该如何解决?我需要让我的应用在通信时将 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)我做错了什么?

谢谢

【问题讨论】:

1313427270.504315 是自 1970 年 1 月 1 日(格林威治标准时间)以来的秒数,这是一个绝对度量,与您所在的时区无关。它对应于格林威治标准时间的2011-08-15 16:54:30 和加利福尼亚的2011-08-15 09:54:30。两者都是同一瞬间的不同表示。 【参考方案1】:

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

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

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

【讨论】:

所以,这是我的错。我使用的是标量(本地时间(1313427270))。我应该使用标量(gmtime(1313427270))。那会给我那个时间戳的 perl GMT 版本。谢谢,蒂姆!

以上是关于NSDate dateWithTimeIntervalSince1970 不返回 GMT/UTC 时间的主要内容,如果未能解决你的问题,请参考以下文章

NSDate和NSDateFormatter

NSDate

本地时区的当前 NSDate 是不是在另一个时区的开始和结束 NSDate 范围内?

OC - 时间日期类NSDate

NSDate - 将日期转换为 GMT

通过 NSDate 对象属性进行 Swift 过滤