JSON时间日期及时区格式转换:提取城市名并格式化时间
解决Swift中UTC日期与时区的格式化及城市名提取问题
我来帮你搞定这个问题!要把UTC日期和时区转成你想要的易读格式,分两步走就行:提取时区标识符里的城市名,再把UTC日期格式化成目标时区的样式,最后拼在一起。
第一步:提取时区中的城市名
时区标识符像America/Los_Angeles这种格式,我们可以通过分割字符串取最后一段,再把下划线换成空格就能得到友好的城市名:
let timezoneString: String? = "America/Los_Angeles" // 解包并提取城市名 if let tzId = timezoneString { let parts = tzId.components(separatedBy: "/") if let city = parts.last { // 把下划线替换成空格 let formattedCity = city.replacingOccurrences(of: "_", with: " ") print(formattedCity) // 输出 "Los Angeles" } }
第二步:将UTC日期格式化为目标时区的可读样式
首先把UTC字符串转成Date类型,再用另一个DateFormatter设置目标时区,输出你想要的日期格式:
let utcDateString: String? = "2018-05-26T20:30:00" let targetTimeZoneId = "America/Los_Angeles" // 1. 解析UTC字符串为Date let inputFormatter = DateFormatter() inputFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" inputFormatter.timeZone = TimeZone(identifier: "UTC") if let dateStr = utcDateString, let date = inputFormatter.date(from: dateStr) { // 2. 格式化目标时区的日期 let outputFormatter = DateFormatter() outputFormatter.dateFormat = "MMMM d, yyyy HH:mm" outputFormatter.timeZone = TimeZone(identifier: targetTimeZoneId) let formattedDate = outputFormatter.string(from: date) print(formattedDate) // 输出 "May 26, 2018 10:30" }
整合两步,得到最终结果
把上面两部分结合起来,就能生成你想要的完整字符串:
let utcDateString: String? = "2018-05-26T20:30:00" let timezoneString: String? = "America/Los_Angeles" // 提取城市名 var formattedCity = "" if let tzId = timezoneString { let parts = tzId.components(separatedBy: "/") if let city = parts.last { formattedCity = city.replacingOccurrences(of: "_", with: " ") } } // 格式化日期 var formattedDate = "" if let dateStr = utcDateString { let inputFormatter = DateFormatter() inputFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss" inputFormatter.timeZone = TimeZone(identifier: "UTC") if let date = inputFormatter.date(from: dateStr) { let outputFormatter = DateFormatter() outputFormatter.dateFormat = "MMMM d, yyyy HH:mm" outputFormatter.timeZone = TimeZone(identifier: timezoneString ?? "UTC") formattedDate = outputFormatter.string(from: date) } } // 拼接最终结果 if !formattedDate.isEmpty && !formattedCity.isEmpty { let finalResult = "\(formattedDate) and \(formattedCity)" print(finalResult) // 输出 "May 26, 2018 10:30 and Los Angeles" }
这里要注意处理所有可选值的解包,避免运行时崩溃。另外,DateFormatter的dateFormat要和输入的UTC字符串格式完全匹配,不然解析会失败哦。
内容的提问来源于stack exchange,提问作者Coding while Loading
相关产品推荐
相关产品推荐

