【问题标题】:Converting from Unix Time giving the wrong result从 Unix 时间转换给出错误的结果
【发布时间】:2014-07-23 11:48:33
【问题描述】:

我正在尝试将 Unix 时间字符串转换为 Xcode 中的日期,但我的时间总是错误的两个小时。我无法弄清楚我做错了什么。有人可以帮帮我吗?

NSString *unixTime = @"1402473600";
NSTimeInterval timeStamp = [unixTime doubleValue];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeStamp];

它给了我:2014-06-11 10:00:00 CEST

...但应该是:2014-06-11 08:00:00 CEST

【问题讨论】:

  • 根据onlineconversion.com/unix_time.htm,现在是“格林威治标准时间 2014 年 6 月 11 日星期三 08:00:00”
  • 是的,但这不是 xcode 给我的...
  • xCode 记录 +0000 时间,而您希望 CEST 时间有 2 小时的差异。
  • 已确认 - 转换为您的时区时,Unix 1402473600 的正确日期是 Jun 11 2014 10:00:00 GMT+2,即 CEST。 Xcode 为您提供了完全正确的值。
  • 这是因为您在 NSLog() 调用中使用了 [NSDate description]。使用NSDateFormatter 打印日期,并使用正确配置的时区,情况会有所不同。

标签: ios objective-c xcode unix-timestamp


【解决方案1】:

xCode 会为您返回 UTC+0 时区的正确值。不要忘记 CEST 是 UTC+2。这是代码 sn-p 来测试它:

// your code
NSString *unixTime = @"1402473600";
NSTimeInterval timeStamp = [unixTime doubleValue];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeStamp];
NSLog(@"%@", date); // 08:00:00 +0000

// CEST, UTC+2 formatting
NSDateFormatter *localDF = [[NSDateFormatter alloc] init];
[localDF setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CEST"]]; // which is CEST, which is UTC+2
[localDF setDateFormat:@"HH:mm:ss Z"];

NSLog(@"%@", [localDF stringFromDate:date]); // 10:00:00 +0200

您可以将日期转换为 CEST 时区。根据结果​​,您可以将给定日期转换为具有调整值的新日期变量,或根据所需时区创建字符串表示:

变体 1. 返回给定日期和时区的字符串表示形式:

NSDateFormatter *cestDF = [[NSDateFormatter alloc] init];
[cestDF setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"CEST"]]; // which is CEST, which is UTC+2
[cestDF setDateFormat:@"HH:mm:ss Z"];
NSString *cestDateStr = [cestDF stringFromDate:date];

变体 2. 新的和调整后的日期对象:

NSTimeInterval timeZoneOffset = [[NSTimeZone timeZoneWithAbbreviation:@"CEST"] secondsFromGMT];
NSTimeInterval cestTimeInterval = [date timeIntervalSinceReferenceDate] + timeZoneOffset;
NSDate *cestDate = [NSDate dateWithTimeIntervalSinceReferenceDate:cestTimeInterval];

注意:NSDate 内部没有时区的概念,因此您应该记住您的 NSDate 变量位于哪个时区。

【讨论】:

  • 您的转换使错误时间增加了 2 小时。我将“+ timeZoneOffset”更改为“- timeZoneOffset”。然后它变得正确。
  • 如果减去,您将得到 6:00。你收到 UTC+0 的 unixTime 吗?
  • 您应该使用 NSDateFormatter 或使用 NSTimeZone 手动调整给定日期来转换日期。如果你同时做这两种变体,你会得到两次应用的调整。
  • 我真的很困惑。世界各地的 Unix 时间不都一样吗?我正在从互联网上的服务器获取 unixTime。使用变体 1,我通过将 @"CEST" 替换为 @"UTC" 得到正确的结果
  • 这是我在设备上测试的要点:gist.github.com/keenle/ba773a9fa330dd05ab5e。请尝试运行它,你观察到相同的结果吗?
猜你喜欢
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-31
  • 2013-09-12
  • 1970-01-01
  • 2011-07-25
  • 1970-01-01
相关资源
最近更新 更多