swift UIKIT 将 GMT 转换为当地时间错误

GMT to local time conversion ERROR with swift UIKIT

有没有人知道为什么我使用以下公式将时间从格林威治标准时间转换为本地时间时得到 -8 小时而不是 -7(我的时区)小时差:

print("TIMEZONE IN HOURS: \(timeZone/3600)")
        
let interval = Date(timeIntervalSinceReferenceDate: 93866.4142533315)
print("GMT TIME: \(interval)")
        
let intervalDateComponents = calendar.dateComponents([.hour, .minute, .second], from: interval)
let mHour = intervalDateComponents.hour ?? 0
let mMinute = intervalDateComponents.minute ?? 0
print("INTERVAL DATE COMPONENT: \(intervalDateComponents)")
    
let formatter = DateFormatter()
        
formatter.timeZone = TimeZone.current
        
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
        
let intervalDateString = formatter.string(from: interval)
        
print("DATE STRING FORMAT: \(intervalDateString)")
        

打印出以下内容:(请注意日期)

TIMEZONE IN HOURS: -7
GMT TIME: 2001-01-02 02:04:26 +0000 (January 2)
INTERVAL DATE COMPONENT: hour: 18 minute: 4 second: 26 isLeapMonth: false 
DATE STRING FORMAT: 2001-01-01 18:04:26 (January 1)
interval HOURS: 18

edit/update:

let mDateString = formatter.string(from: interval) 
print("DATE STRING FORMAT: (mDateString)")
let mdate = formatter.date(from: mDateString) 
print("MDATE: (mdate)")
let mDateComponents = calendar.dateComponents([.hour, .minute, .second], from: mdate!)
print("M DATE COMPONENT: (mDateComponents)")

打印出来:

DATE STRING FORMAT: 2001-01-01 19:01:27 -0700 
MDATE: Optional(2001-01-02 02:01:27 +0000)
M DATE COMPONENT: hour: 18 minute: 1 second: 27 isLeapMonth: false 

如果您注意到上面的代码,我的意图是提取本地时间组件以在每天晚些时候触发警报。所以我输入了显示

的字符串
2001-01-01 19:01:27 -0700

我将字符串转换为 mdate 以获取我需要用于闹钟准时工作的时间组件,所以我得到了 (hour: 18) 而不是 hour: 19 我用来生成 mdate 字符串.

问题是您获取的是今天的时区偏移量。您需要获取您正在使用的同一日期的时区偏移量:

let timeZone = TimeZone.current.secondsFromGMT(for: interval)
print("TIMEZONE IN HOURS: \(timeZone/3600)")