3

在我提交雷达之前,我想仔细检查我是否没有遗漏任何东西(并从中学习)。这是我在 Swift 3 操场上的测试代码(代码在我的应用程序中的行为相同)。我目前在时区“欧洲/里斯本”工作,该时区在 2 月与 GMT 相同。

import UIKit

let date =  Date(timeIntervalSince1970: 0)
var formatter = DateFormatter()
formatter.dateFormat = "HH:mm"

print(TimeZone.current.abbreviation()!) // GMT

formatter.timeZone = TimeZone.current
print(formatter.string(from: date)) // 01:00

formatter.timeZone = TimeZone(secondsFromGMT: TimeZone.current.secondsFromGMT())
print(formatter.string(from: date)) // 00:00

formatter.timeZone = TimeZone(identifier: "Europe/London")
print(formatter.string(from: date)) // 01:00

formatter.timeZone = TimeZone(identifier: "America/Los_Angeles")
print(formatter.string(from: date)) // 16:00

不知何故,格式化的时间是一小时,除非我将时区设置为

TimeZone(secondsFromGMT: TimeZone.current.secondsFromGMT())

这是预期的行为吗?谢谢!

4

1 回答 1

2

结果实际上是正确的,因为在 1970 年,“欧洲/里斯本”时区是“UTC+1”:

let tz = TimeZone(identifier: "Europe/Lisbon")!

print(tz.secondsFromGMT())
// Output: 0

print(tz.secondsFromGMT(for: Date(timeIntervalSince1970: 0)))
// Output: 3600

因此,“格林威治标准时间 1970 年 1 月 1 日”的午夜是里斯本的凌晨 1 点。

您可以在https://www.timeanddate.com/time/zone/portugal/lisbon查找过去和未来几年的时区和夏令时。

于 2017-02-19T12:42:19.190 回答