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

Swift中选择时区标识符后如何获取时区缩写等相关信息

问题描述

我是Swift新手,正在PickerView中实现时区标识符选择功能,目前已基本完成,但选中PickerView的特定选项时,无法获取时区缩写及相关数据,恳请各位提供帮助。相关代码如下:

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        //        store = timezone[row]
        if pickerView == pickerOne {
            let storeTime = self.timeZoneIdentifiers[row]
            timeZone = TimeZone.init(identifier: storeTime)!
            selectLabel.text = "\(timeZone)"
            
        } else if pickerView == pickerTwo {
            let storeLocale = self.language[row]
            locale = Locale.init(identifier: storeLocale)
            selectLabelTwo.text = "\(locale)"
        }
}
解决方案

你现在直接把TimeZone对象转成字符串,得到的只是时区标识符(比如America/New_York),要拿到时区缩写或友好名称,得调用TimeZone的对应方法:

  • 获取时区缩写:用abbreviation()方法,注意部分时区没有通用缩写,所以要做可选绑定避免崩溃:
if pickerView == pickerOne {
    let storeTime = self.timeZoneIdentifiers[row]
    guard let timeZone = TimeZone(identifier: storeTime) else { return }
    self.timeZone = timeZone
    
    if let abbreviation = timeZone.abbreviation() {
        selectLabel.text = abbreviation
    } else {
        // 没有缩写时 fallback 到标识符
        selectLabel.text = timeZone.identifier
    }
}
  • 获取本地化友好名称:如果需要更易读的名称(比如“Eastern Standard Time”),用localizedName(for:locale:)方法:
if pickerView == pickerOne {
    let storeTime = self.timeZoneIdentifiers[row]
    guard let timeZone = TimeZone(identifier: storeTime) else { return }
    self.timeZone = timeZone
    
    if let localizedName = timeZone.localizedName(for: .generic, locale: .current) {
        selectLabel.text = localizedName
    } else {
        selectLabel.text = timeZone.identifier
    }
}

另外,代码里用!强制解包TimeZone(identifier:)有崩溃风险,建议换成guard let安全处理,防止无效标识符导致程序崩溃。

内容的提问来源于stack exchange,提问作者shanimKashmiri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 05:15:42