在 Swift 中将日期从 GMT+1 转换为 UTC 时出现混淆
Confusion when converting date from GMT+1 to UTC in 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: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.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 相差一到两个小时,具体取决于是否
夏令时在指定日期有效。
尝试将“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。为什么会这样,我该如何正确转换它?
我在操场上和实际设备上都试过了
这是我使用的代码:
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 相差一到两个小时,具体取决于是否 夏令时在指定日期有效。