快速 UTC 时区不是 UTC。

11

我有一个关于Swift中TimeZone类型的问题。

我需要获取UTC0时区来格式化我的日期对象。我是这样创建TimeZone对象的:

let utcTimeZone = TimeZone(abbreviation: "UTC")

但是当我创建这个对象时,它会给我返回GMT0时区。在Swift中能否获取UTC0时区?此外,playground中的GMT (fixed)GMT (GMT) offset 0有什么区别?

Xcode 10.3 Playground enter image description here


你是如何获取GMT (GMT) offset 0时区的? - Sweeper
@Sweeper 在问题中添加了截图。 - Alex Prytchyn
3个回答

23

从技术上讲,UTC和GMT之间有微小的差异, 但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()))

同时,playground中GMT(fixed)和GMT(GMT)偏移量0之间有什么区别?
前者来自Swift的TimeZone类,后者来自Objective-C的NSTimeZone类。一个是另一个的桥接版本。根据NSTimeZone的docs
当您需要引用语义或其他Foundation特定行为时,请使用NSTimeZone。

2

在一些设备上,若只设置协调世界时(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")

2

我也在那里,根据谷歌

协调世界时(UTC)和格林威治标准时间(GMT)之间没有时间差异

换句话说,GMT基本上等同于UTC,所以你已经有了它!

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

第二行的fixed表示它是GMT,偏移数据可能是不变的。我不知道没有打开playground,但我会尝试在实例化后更改时区并查看偏移量是否可以在分配后更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接