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

abc*_*efg 3 date utc gmt ios swift

当您尝试将"2016-06-23 12:00:00"转换为UTC日期时,我会收到"2016-06-23 10:00:00"

第一个日期是GMT + 1,我想转换为UTC.如果我没弄错GMT + 0 == UTC所以12:00应该是11:00对吗?但我总是得到10点.为什么会这样,我该如何正确转换它?

我在操场上和实际设备上都试过这个

这是我使用的代码:

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

}

}
Run Code Online (Sandbox Code Playgroud)

输出:

1: 2016-06-23 12:00:00
GMT+1
2: 2016-06-23 10:00:00
Run Code Online (Sandbox Code Playgroud)

Mar*_*n R 8

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

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

 let tz = TimeZone(abbreviation: "GMT+1")
 print(tz) // nil
Run Code Online (Sandbox Code Playgroud)

因此,在

dateForm.timeZone = TimeZone(abbreviation: "GMT+1")
Run Code Online (Sandbox Code Playgroud)

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

dateForm.timeZone = TimeZone(abbreviation: "GMT+01")
Run Code Online (Sandbox Code Playgroud)

你会得到预期的结果.或者,从(数字)GMT偏移或其标识符创建时区:

dateForm.timeZone = TimeZone(secondsFromGMT: 3600)
dateForm.timeZone = TimeZone(identifier: "GMT+0100")
Run Code Online (Sandbox Code Playgroud)

附录(回应您的意见):

TimeZone(identifier: "GMT+0100") 
TimeZone(identifier: "Europe/Berlin")
Run Code Online (Sandbox Code Playgroud)

不同的时区.第一个使用一个小时的固定GMT偏移,第二个是区域中的时区(在这种情况下是德国),并且与UTC相差一到两个小时,具体取决于夏令时是否在指定日期.

  • @abcdefg最好永远不要从时区缩写创建时区.正如您所见,它并不总是有效.此外,还有重复的缩写和大量无效缩写.始终使用`identifier`或`secondsFromGMT`初始值设定项来避免这些问题. (3认同)