这应该是一个非常简单的问题
鉴于我的时区是EDT(GMT-4),为什么GMT中的04:00变成23:00而不是00:00?
// The offset is -4 hours
let offsetFromGMT = Calendar.current.timeZone.secondsFromGMT() / 60 / 60
// 2017-03-12 04:00
var destinationComponents = DateComponents()
destinationComponents.timeZone = TimeZone(secondsFromGMT: 0)
destinationComponents.year = 2017
destinationComponents.month = 03
destinationComponents.day = 12
destinationComponents.hour = -offsetFromGMT // 4 hours
// Why is this 2017-03-11 23:00 and not 2017-03-12 00:00?
let date = Calendar.current.date(from: destinationComponents)!
// Outputs 23
Calendar.current.dateComponents([.hour], from: date).hour
Calendar.current.timeZone.secondsFromGMT()
是您时区的电流 GMT偏移。在您的情况下为4小时,因为纽约的当前时区是EDT = GMT-4,随着日光节省时间活动。
所以您的destinationComponents
和date
在早晨格林威治时间:
2017-03-12 04:00:00 +0000
那时,纽约的时区为EST = GMT-5,并且节省时间不活跃。因此,该日期是您本地时区的2017-03-11 23:00
。
我会以不同的方式进行,避免了"秒fromgmt"。
示例:" 2017-03-12 00:00:00"纽约时间是" 2017-03-12 05:00:00" GMT。
var srcComponents = DateComponents()
srcComponents.timeZone = TimeZone(identifier: "America/New_York")!
srcComponents.year = 2017
srcComponents.month = 3
srcComponents.day = 12
srcComponents.hour = 0
srcComponents.minute = 0
let date = Calendar.current.date(from: srcComponents)!
print(date) // 2017-03-12 05:00:00 +0000