Swift中如何按指定时区(如+8)格式化日期为指定时间格式?
解决东八区时间格式化问题
我懂你已经搞定了ISO日期字符串转Date的环节,现在就差把这个Date转成东八区(UTC+8)的hh:mm a格式了对吧?其实核心就是给DateFormatter显式设置目标时区,再配合正确的格式字符串就行,我给你整理了完整的实现步骤:
完整代码示例
// 你的初始转换代码(已经没问题的部分) let dateString = "2018-04-29T21:00:00.000Z" let inputFormatter = DateFormatter() inputFormatter.locale = Locale(identifier: "en_US_POSIX") inputFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss.SSSZ" guard let convertedDate = inputFormatter.date(from: dateString) else { fatalError("Failed to convert date string") } // 重点:东八区格式化部分 let outputFormatter = DateFormatter() // 设置东八区时区,两种写法任选其一都可以 outputFormatter.timeZone = TimeZone(identifier: "Asia/Shanghai") // 或者用秒数直接计算:outputFormatter.timeZone = TimeZone(secondsFromGMT: 8 * 3600) // 指定输出格式 outputFormatter.dateFormat = "hh:mm a" // 设置locale控制上午/下午的显示语言: // 要英文AM/PM就用en_US_POSIX,要中文"上午/下午"就换成zh_CN outputFormatter.locale = Locale(identifier: "en_US_POSIX") // 最终格式化结果 let formattedTime = outputFormatter.string(from: convertedDate) print(formattedTime) // 输出:05:00 AM(UTC+0的21:00加8小时就是UTC+8的次日5点)
关键注意点
Date类型本身是无时区的时间戳,格式化时默认会用系统当前时区,所以必须手动指定Asia/Shanghai(或UTC+8的秒数)才能得到东八区的时间。locale的设置会影响a标识符的显示:比如用zh_CN的话,输出会变成05:00 上午,根据你的需求调整就行。
内容的提问来源于stack exchange,提问作者Chowdhury Md Rajib Sarwar
相关产品推荐
相关产品推荐

