【问题标题】:NSTimeZone: Any difference between "UTC" and "GMT"?NSTimeZone:“UTC”和“GMT”有什么区别吗?
【发布时间】:2013-02-03 12:39:54
【问题描述】:

这五个语句是否可以互换,或者是否有人知道使用它们会产生不同结果的情况?据我所知,它们是等价的,但我还没有发现任何结论,GMT 和 UTC 变体之间的潜在差异让我担心。

[NSTimeZone timeZoneWithName:@"GMT"];
[NSTimeZone timeZoneWithName:@"UTC"];
[NSTimeZone timeZoneWithAbbreviation:@"GMT"];
[NSTimeZone timeZoneWithAbbreviation:@"UTC"];
[NSTimeZone timeZoneForSecondsFromGMT:0];

【问题讨论】:

  • 我比较确定这两者在 iOS 中基本相同。

标签: ios utc gmt nstimezone


【解决方案1】:

根据the docsCFTimeZone(以及扩展名NSTimeZone)使用来自TZ (or "Olsen") Database 的时区名称、缩写、GMT 偏移量和 DST 信息。

查看the source,您会发现虽然“GMT”和“UTC”在语义上截然不同,但实际上它们并没有什么不同:“GMT”只是一个零偏移时区。

更新:虽然这个答案对于 1968 年 4 月 9 日之后的日期仍然适用,但在处理历史日期时,Cocoa 似乎使用了在相关日期有效的 GMT 过去定义(而不是现代定义)。这意味着 1968 年 4 月 9 日之前的日期,GMT 和 UTC 可能有所不同。有关详细说明,请参阅this informative blog post 的结尾。

【讨论】:

  • 感谢您的完美回答,我做梦也想不到更权威的!在语义上,我担心的一个原因是 Apple 文档似乎将通用时间称为 GMT(不是 UTC,正如我所预料的那样)。例如,Apple 将 NSDate 的 timeIntervalSinceReferenceDate 描述为“返回接收器与 2001 年 1 月 1 日格林威治标准时间的第一时刻之间的时间间隔”。但现在我已经习惯了,谢谢。
【解决方案2】:

在几乎所有情况下,GMT 都意味着 UTC。
但今天,它的本意是错误的。
不幸的是,Apple 使用术语 GMT,而它应该使用 UTC。

GMT 在 UTC 的意义上不再存在(自 1928 年以来),但不幸的是,在英国和非洲,该术语仍用于表示西欧时间或西欧夏令时。今天真正的 GMT 称为 UT,与 UTC 最多相差 0.9 秒。

维基百科上的文章:English | German

但是在某些计算机程序(邮件标题)中,由于历史原因(unix),它仍然被称为 GMT(在 UTC 的意义上)

【讨论】:

    【解决方案3】:

    Apple's NSDateFormatter and Internet Dates article 使用[NSTimeZone timeZoneForSecondsFromGMT:0]

    static NSDateFormatter *    sRFC3339DateFormatter;
    NSString *                  userVisibleDateTimeString;
    NSDate *                    date;
    
    // If the date formatters aren't already set up, do that now and cache them
    // for subsequence reuse.
    
    if (sRFC3339DateFormatter == nil) {
        NSLocale *                  enUSPOSIXLocale;
    
        sRFC3339DateFormatter = [[NSDateFormatter alloc] init];
    
        enUSPOSIXLocale = [NSLocale localeWithLocaleIdentifier:@"en_US_POSIX"];
    
        [sRFC3339DateFormatter setLocale:enUSPOSIXLocale];
        [sRFC3339DateFormatter setDateFormat:@"yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'"];
        [sRFC3339DateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-10
      • 2017-01-23
      • 2012-12-17
      • 2019-04-19
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      • 2018-04-22
      • 1970-01-01
      相关资源
      最近更新 更多