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
相关产品推荐
相关产品推荐

