You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:29:57