Swift UTC 时区不是 UTC

Posted

技术标签:

【中文标题】Swift UTC 时区不是 UTC【英文标题】:Swift UTC TimeZone is not UTC 【发布时间】:2020-02-06 23:18:17 【问题描述】:

我有一个关于 Swift 类型 TimeZone 的问题。 我需要获取 UTC0 时区来格式化我的 Date 对象。我正在创建这样的 TimeZone 对象。

let utcTimeZone = TimeZone(abbreviation: "UTC")

但是当创建这个对象时,我给出了 GMT0 时区。这有可能在 Swift 中获得 UTC0 时区吗?还有GMT (fixed)GMT (GMT) offset 0在操场上有什么区别?

Xcode 10.3 游乐场

【问题讨论】:

您是如何获得GMT (GMT) offset 0 时区的? @Sweeper 为问题添加了屏幕截图。 【参考方案1】:

从技术上讲,UTC 和 GMT 之间有 really subtle differences(GMT 可能意味着 UT1),但 API 的设计者认为它们实际上是相同的(它们确实如此),所以他们实现了这一点:

TimeZone(identifier: "UTC") == TimeZone(identifier: "GMT")

它们都代表一个偏移量为 0 的时区。

如果您只想在某些输出文本中显示字母“UTC”,请使用DateFormatter

let formatter = DateFormatter()
formatter.timeZone = TimeZone(identifier: "UTC")
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss 'UTC'"
print(formatter.string(from: Date()))

或者更好的是,使用ISO8601DateFormatter,它会在日期末尾添加Z,以表明日期时间是UTC:

let formatter = ISO8601DateFormatter()
formatter.timeZone = TimeZone(identifier: "UTC")
print(formatter.string(from: Date()))

还有什么是GMT(固定)和GMT(GMT)在操场上偏移0的区别?

前者来自于 Swift 的TimeZone 类,后者来自于Objective-C 的NSTimeZone 类。一个是另一个的桥接版本。来自NSTimeZone的docs,

当您需要引用语义或其他 Foundation 特定行为时,请使用 NSTimeZone

【讨论】:

【参考方案2】:

根据谷歌,我去过那里

协调世界时和格林威治标准时间没有时差

换句话说,GMT(基本上)是 UTC,所以你已经有了它!

offset 0 指的是与 UTC/GMT 的时区偏移量,即 0,如果您在 EST 中,则可能为 240(取决于它是否以分钟、小时、毫秒等为单位)。

第二行上的fixed 表示它是格林威治标准时间,并且偏移数据可能是不可变的。如果没有打开操场,我不会知道,但我会尝试在实例化后更改时区,看看是否可以在分配后更改偏移量。

【讨论】:

【参考方案3】:

您可以使用它来代替 UTC,在某些设备中仅设置 UTC 不起作用

let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en_US_POSIX")
dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"
let date = dateFormatter.date(from: "2020-01-23T11:55:00.000Z")

【讨论】:

以上是关于Swift UTC 时区不是 UTC的主要内容,如果未能解决你的问题,请参考以下文章

给定 UTC 时间戳和 UTC 偏移量,是不是可以在 Python 中获取时区?

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

如何在 Swift 中解析/创建格式为小数秒 UTC 时区(ISO 8601、RFC 3339)的日期时间戳?

英语里面UTC是哪个时区?

如何在特定时区(最好是我的应用程序的默认时区,而不是 UTC)中创建新的 DateTime 对象?

iOS:将 UTC NSDate 转换为本地时区