Swift如何将UTC时区的“时:分:秒 AM/PM”转为用户时区的“时:分 AM/PM”
实现方案
核心逻辑
- 先用指定格式的DateFormatter把输入的UTC时间字符串解析为标准Date对象,解析器时区固定为UTC
- 再用目标格式的DateFormatter把Date对象格式化为当前时区的字符串,自动适配用户本地时区
完整可运行代码
func convertUTCSunriseTimeToLocal(utcTimeStr: String) -> String? { // 配置UTC时间解析器 let utcParser = DateFormatter() utcParser.dateFormat = "h:mm:ss a" utcParser.timeZone = TimeZone(identifier: "UTC") // 固定locale避免系统语言导致AM/PM解析失败 utcParser.locale = Locale(identifier: "en_US_POSIX") guard let date = utcParser.date(from: utcTimeStr) else { return nil } // 配置本地时间格式化器 let localFormatter = DateFormatter() localFormatter.dateFormat = "h:mm a" localFormatter.timeZone = TimeZone.current // 如果需要输出AM/PM以外的本地化标识,替换为Locale.current即可 localFormatter.locale = Locale(identifier: "en_US_POSIX") return localFormatter.string(from: date) } // 调用示例 let result = convertUTCSunriseTimeToLocal(utcTimeStr: "10:3:30 AM") // 示例输出(东8区场景):6:03 PM
注意事项
- 不需要你额外获取当前时区的缩写做转换,TimeZone.current会自动读取用户设备的当前时区
- 解析和格式化时指定
en_US_POSIX是为了保证AM/PM的解析和输出符合要求,避免系统语言切换导致的异常 - 如果转换失败返回nil,可根据业务需要设置默认兜底值
内容的提问来源于stack exchange,提问作者GSDV
相关产品推荐
相关产品推荐

