You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,请问该问题的原因是什么?


问题原因分析

  1. 时区认知错误:耶路撒冷所在的以色列时区,根本不存在GMT-3的偏移规则。实际以色列采用双时区制:

    • 以色列标准时间(IST):GMT+2(非夏令时期间)
    • 以色列夏令时(IDT):GMT+3(夏令时期间,通常覆盖3月到10月)
  2. 代码结果符合实际规则:你得到的10:00,说明当前设备处于以色列标准时间(GMT+2)时段。本地时间12:00转换为GMT(UTC)的计算逻辑是12:00 - 2小时 = 10:00,这完全符合时区转换的实际规则。

  3. 预期结果的错误来源:你预期的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:32:13