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

问题描述:

尝试将“2016-06-23 12:00:00”转换为UTC日期时我收到“2016-06-23 10:00:00”在Swift中将日期从GMT + 1转换为UTC时出现混乱

第一个日期是在GMT + 1,我想要转换为UTC。如果我没有误认为GMT + 0 == UTC,那么12:00应该是11:00?但我总是得到10:00。为什么是这种情况,我如何正确转换它?

我都在操场上和实际设备

在尝试这样做这是我使用的代码:

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.timeZonenil,这意味着日期 字符串在默认解释(本地) 时区。

随着

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

你会得到预期的结果。

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

补遗(响应于您的注释)::另外,从(数字)GMT的偏移或从它的标识符创建的时区

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

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

+0

谢谢,这确实使它的工作!令我困惑的是TimeZone.current.abbreviation()!给我GMT + 1,而不是GMT + 01 ... 当我现在把TimeZone(缩写:TimeZone.current.abbreviation()!)它不会再工作,我该怎么办? – abcdefg

+0

啊哈。 :)))))))))我认为我们也应该建议他看看什么时区_is_而不是仅仅做一个假设。 – matt

+2

@abcdefg最好不要从时区缩写中创建时区。正如你所看到的,它并不总是工作。另外还有重复的缩写和大量无效的缩写。总是使用'identifier'或'secondsFromGMT'初始化器来避免这些问题。 – rmaddy