Swift代码转HH:mm为GMT时间异常:耶路撒冷时区结果不符预期
问题:耶路撒冷时区下时间转换结果不符合预期
我用以下Swift代码将HH:mm格式的字符串转换为GMT时区的时间字符串:
func convertToGMT(timeString: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = "HH:mm" // Assuming the input time is in the user's local time zone dateFormatter.timeZone = TimeZone.current // Parse the input time string into a Date object guard let date = dateFormatter.date(from: timeString) else { return "" // Return nil if the input format is invalid } // Convert the date to GMT (UTC) time zone dateFormatter.timeZone = TimeZone(abbreviation: "GMT") let gmtTimeString = dateFormatter.string(from: date) return gmtTimeString }
但遇到问题:在耶路撒冷时区(我以为是GMT-3)下,输入12:00时得到的结果是10:00,而预期结果应为09:00,请问该问题的原因是什么?
问题原因分析
时区认知错误:耶路撒冷所在的以色列时区,根本不存在
GMT-3的偏移规则。实际以色列采用双时区制:- 以色列标准时间(IST):
GMT+2(非夏令时期间) - 以色列夏令时(IDT):
GMT+3(夏令时期间,通常覆盖3月到10月)
- 以色列标准时间(IST):
代码结果符合实际规则:你得到的
10:00,说明当前设备处于以色列标准时间(GMT+2)时段。本地时间12:00转换为GMT(UTC)的计算逻辑是12:00 - 2小时 = 10:00,这完全符合时区转换的实际规则。预期结果的错误来源:你预期的
09:00是基于错误的GMT-3偏移计算的,但这个偏移和耶路撒冷的实际时区毫无关系——如果真的处于GMT-3时区,本地12:00转换为GMT应该是15:00(GMT-3表示本地时间比UTC晚3小时,因此UTC时间=本地时间+3),本质是你搞反了时区偏移的方向,同时错误认知了耶路撒冷的时区规则。
另外补充一个小优化建议:用TimeZone(secondsFromGMT: 0)替代TimeZone(abbreviation: "GMT")来获取UTC时区,因为缩写解析可能存在不稳定的情况。
内容的提问来源于stack exchange,提问作者YosiFZ
相关产品推荐
相关产品推荐

