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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:24:08