ios - 在 Swift 中将日期从 GMT+1 转换为 UTC 时出现混淆

标签 ios swift date utc gmt

当尝试将“2016-06-23 12:00:00”转换为 UTC 日期时,我得到“2016-06-23 10:00:00”

第一个日期是 GMT+1,我想将其转换为 UTC。如果我没记错 GMT+0 == UTC 那么 12:00 应该是 11:00 对吧?但我总是得到 10:00。为什么会这样?如何正确转换?

我在 Playground 上和实际设备上都试过了

这是我使用的代码:

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    let datestring:String = "2016-06-23 12:00:00"

    print("1: "+datestring)

    print("2: "+convertDateToUTC(datestring))

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func convertDateToUTC(_ datestring:String) -> String {

    let dateForm = DateFormatter()
    dateForm.dateFormat = "yyyy-MM-dd HH:mm:ss"
    dateForm.timeZone = TimeZone(abbreviation: "GMT+1")

    print(TimeZone.current.abbreviation()!)

    let date = dateForm.date(from: datestring)

    dateForm.timeZone = TimeZone(abbreviation: "UTC")

    let date1 = dateForm.string(from: date!)

    return date1

}

}

输出:

1: 2016-06-23 12:00:00
GMT+1
2: 2016-06-23 10:00:00

最佳答案

简短回答:"GMT+1" 替换为 "GMT+01"

"GMT+1" 不是有效的时区缩写:

 let tz = TimeZone(abbreviation: "GMT+1")
 print(tz) // nil

因此,在

dateForm.timeZone = TimeZone(abbreviation: "GMT+1")

您将 dateForm.timeZone 设置为 nil,这意味着日期 字符串在您的默认(本地)时区中解释。

dateForm.timeZone = TimeZone(abbreviation: "GMT+01")

您将获得预期的结果。或者,创建时区 来自(数字)GMT 偏移量或其标识符:

dateForm.timeZone = TimeZone(secondsFromGMT: 3600)
dateForm.timeZone = TimeZone(identifier: "GMT+0100")

附录(回应您的评论):

TimeZone(identifier: "GMT+0100") 
TimeZone(identifier: "Europe/Berlin")

不同时区。第一个使用一小时的固定 GMT 偏移量,第二个是某个地区(在本例中为德国)的时区, 与 UTC 相差一到两个小时,具体取决于是否 夏令时在指定日期有效。

关于ios - 在 Swift 中将日期从 GMT+1 转换为 UTC 时出现混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40962492/

相关文章:

ios - 如何在 Xcode 控制台中禁用 Firebase/Analytics 登录?

ios - 使用混合滤镜时 GPUImage 崩溃 ('over release framebuffer')

ios - GCM IOS 设备未注册

ios - 系统时区与选定时区

Java 日期和夏令时

ios - 使用未解析的标识符 countElements

ios - if#available(iOS 9, *) 不起作用

ios - Root View Controller Swift

MySQL显示范围内的所有日期

mysql - 从 MySql 中检索两个 Varchar 日期之间的数据