如何将Int类型时间戳转换为指定时区格式的日期字符串?
问题解决:将时间戳转换为指定时区的格式化日期字符串
问题根源
你当前代码用TimeZone.init(abbreviation: timezoneCode)设置时区,但THA并非所有系统都能识别的标准时区缩写,这会导致TimeZone初始化失败返回nil,此时DateFormatter会自动 fallback 到设备默认时区(比如你得到的GMT+5:30),最终输出不符合预期。
API返回的region字段(Asia/Phnom_Penh)是IANA标准时区标识符,比缩写可靠得多,应该优先用它初始化时区。
修改方案
1. 调整时区参数来源
从API响应中获取region字段替代原有的code:
// 从API响应中取标准时区标识符 let timezoneRegion = response.timeZone.region ?? "" if let updatedOn = self.dict?["updated_on"]?.intValue { // 示例时间戳:1669903421000 let dateValue = Date(milliseconds: Int64(updatedOn)) stringDate = dateToStringTimeZone(date: dateValue, dateFormat: "MM/dd/yyyy hh:mm:ss a zzz", timeZoneRegion: timezoneRegion) }
2. 更新日期转换函数
改用IANA时区标识符初始化时区,同时确保时区缩写显示正确:
func dateToStringTimeZone(date: Date, dateFormat: String, timeZoneRegion: String) -> String { let dateFormatter = DateFormatter() dateFormatter.dateFormat = dateFormat dateFormatter.locale = Locale(identifier: "en_US_POSIX") // 用标准时区标识符初始化,避免缩写不识别问题 if let timeZone = TimeZone(identifier: timeZoneRegion) { dateFormatter.timeZone = timeZone } // 可选:设置为泰国英文 locale,确保时区缩写显示为THA dateFormatter.locale = Locale(identifier: "en_TH") return dateFormatter.string(from: date) }
3. 验证时间戳转换逻辑
你的示例时间戳1669903421000对应的UTC时间是2022-12-01 14:03:41,转换为UTC+7(泰国时区)后就是2022-12-01 21:03:41,格式化后正好是预期的12/01/2022 09:03:41 PM THA。
额外提示
- IANA时区标识符(如
Asia/Phnom_Penh、Asia/Bangkok)是跨平台通用的,不会出现缩写不兼容的问题。 - 如果不需要强制显示
THA,仅用en_US_POSIXlocale也能正常输出时区信息,但搭配en_TH可以确保缩写完全符合预期。
内容的提问来源于stack exchange,提问作者kiran
相关产品推荐
相关产品推荐

