【问题标题】:NSDate Output incorrectly [duplicate]NSDate输出不正确[重复]
【发布时间】:2012-10-24 00:13:01
【问题描述】:

可能重复:
Getting date from [NSDate date] off by a few hours

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"M-d-yyyy H:mm"];

NSDate *start= [dateFormatter dateFromString:@"10-24-2012 12:15"];
NSDate *end  = [dateFormatter dateFromString:@"10-24-2012 15:30"];

当我打印出来时

   NSLog(@"------main_event start %@", start);
   NSLog(@"-----main_event end %@", end);

结果是

         ---main_event start 2012-10-24 19:15:00 +0000
         ---main_event end 2012-10-24 22:30:00 +0000

现在,时间好像自动加了 7 个小时,12:15 变成 19:15,15:30 变成 22:30。

为什么?

【问题讨论】:

  • 标准 Objective-C 问题 #6。

标签: objective-c ios cocoa-touch nsdate


【解决方案1】:

因为您的设备所在的时区是 UTC-7。

输出是 UTC(因此是 +0000),因为单个 NSDate 将始终以 UTC 打印它的时间。

如果您使用 NSDateFormatter 输出日期,它将考虑您的语言环境。在这里查看我的答案:NSDate date method returns wrong result

【讨论】:

    【解决方案2】:

    这些是正确的结果。当您使用NSLog 输出NSDate 对象时,它会显示在GMT 中。解析是在您当地的时区完成的。 NSDate 对象始终位于 GMT 中。如果要在本地时区打印 NSDate 对象,则需要 NSDateFormatter 来打印日期。

    【讨论】:

    • 请注意,这并不完全正确:它是 UTC,由于夏令时,GMT 可能与 UTC 不同。 GMT == (UTC+0|UTC+1) en.wikipedia.org/wiki/Greenwich_Mean_Time
    • @vikingosegundo 实际上文档声明时间是从 GMT 输出的偏移量。
    • 如果您更改计算机的时钟,并将模拟器的位置更改为伦敦,您会看到,在某些日期您会得到 +0100,na din winter +0000。我几年前就试过了。另外:«UTC 是 GMT 的代名词,但 GMT 不再被科学界精确定义。» en.wikipedia.org/wiki/UTC
    • 我了解 UTCGMT 之间存在差异。我是说NSDate 的文档声明description 方法中使用的时区是GMT
    • 文档有误。但这些术语很容易混淆。
    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多