Swift转换GMT时间时DateComponents未返回正确时分秒是什么原因?
异常原因
核心问题是时区设置的顺序错误:
- 你调用的
Calendar.current默认使用设备本地时区,第一步从changedDate提取DateComponents时,所有年月日时分秒的数值都是基于本地时区计算得到的,不是GMT时区的数值 - 你是在组件提取完成后才给
datcomp设置GMT时区,这个操作只会影响后续用该DateComponents生成新Date时的参考时区,不会修改已经提取出来的时分秒等数值,所以才会出现时分秒清零、日期偏移的问题。
可行解决方案
推荐优先使用以下方案,提前将Calendar的时区设置为GMT,保证提取的组件数值直接对应GMT时间:
// 初始化使用GMT时区的日历实例 var calendar = Calendar.current calendar.timeZone = TimeZone(secondsFromGMT: 0)! // 用secondsFromGMT比abbreviation更稳妥,避免部分地区缩写歧义 let changedDate = calendar.date(byAdding: .day, value: -10, to: actualDate)! // 直接用GMT时区的日历提取组件,无需后续修改时区 let datcomp = calendar.dateComponents([.year, .month, .day, .hour, .minute, .second], from: changedDate)
如果业务场景需要保留本地时区的Calendar配置,也可以在转换前临时指定时区,逻辑和上述方案一致,核心都是提取组件前就设置好目标时区。
内容的提问来源于stack exchange,提问作者Amogam
相关产品推荐
相关产品推荐

