Swift中如何根据时区格式城市名查询所属国家并获取对应国旗
解决方案
不需要手动维护全量城市-国家映射,根据你支持的系统版本可以选择以下原生/低成本方案:
1. 支持iOS 16+/macOS 13+/watchOS 9+ 及以上版本
Foundation已经提供了原生接口,TimeZone 结构体新增的region属性可直接获取时区所属的国家/地区:
import Foundation func getFlag(for timeZoneID: String) -> String? { guard let timeZone = TimeZone(identifier: timeZoneID), let region = timeZone.region else { return nil } // 地区码转国旗emoji return region.identifier.unicodeScalars.reduce("") { result, scalar in guard let regionalScalar = UnicodeScalar(127397 + scalar.value) else { return result } return result + String(regionalScalar) } } // 测试示例:传入"Asia/Shanghai"返回 🇨🇳,传入"Europe/London"返回 🇬🇧
该接口已经内置了IANA时区到国家/地区的映射逻辑,不需要额外调用其他服务。
2. 需要支持更低系统版本
可选择两种无需手动维护全量映射的方案:
- 方案A:用
CoreLocation的CLGeocoder反查时区对应的地区信息,适合请求量不大的场景,注意需要网络权限且有调用频率限制
import CoreLocation func getCountryCode(for timeZoneID: String, completion: @escaping (String?) -> Void) { guard let timeZone = TimeZone(identifier: timeZoneID) else { completion(nil) return } let geocoder = CLGeocoder() geocoder.geocodeAddressString(timeZoneID) { placemarks, error in guard let countryCode = placemarks?.first?.isoCountryCode else { completion(nil) return } completion(countryCode) } }
- 方案B:导入IANA官方的时区-国家映射表内置到App做本地查询,IANA更新时区数据时同步更新映射表即可,比手动维护映射的准确率和维护成本都低很多。
注意:
Etc/GMT+8这类通用时区本身没有对应国家,返回结果为空属于正常情况。
内容的提问来源于stack exchange,提问作者LeTarrask
相关产品推荐
相关产品推荐

