iOS开发:如何通过全称时区字符串初始化TimeZone对象
通过时区全称(如
Pacific Standard Time)初始化TimeZone的可行方案 系统原生的TimeZone初始化方法确实不支持直接传入这类通用/Windows格式的时区全称,可通过以下两步方案实现兼容:
- 优先通过系统内置时区的本地化名称匹配
苹果系统内置了所有合法IANA时区的多语言展示名称,你可以遍历全部系统支持的时区,固定用英文POSIX locale取对应时区的标准时间、夏令时全称,和传入的字符串做等值匹配,命中即可直接得到对应的TimeZone实例,参考实现如下:
匹配时固定使用func getTimeZone(fullTimeZoneName: String) -> TimeZone? { let matchLocale = Locale(identifier: "en_US_POSIX") for tzIdentifier in TimeZone.knownTimeZoneIdentifiers { guard let timeZone = TimeZone(identifier: tzIdentifier) else { continue } // 匹配标准时间全称 if timeZone.localizedName(for: .standard, locale: matchLocale) == fullTimeZoneName { return timeZone } // 匹配夏令时全称 if timeZone.localizedName(for: .daylightSaving, locale: matchLocale) == fullTimeZoneName { return timeZone } } return nil }en_US_POSIX是为了避免设备当前语言/地区设置非英文时,取到的本地化名称和API返回的英文字符串不匹配的问题。 - 内置映射表做兜底兼容
部分API返回的时区全称遵循Windows时区命名规范,若上述遍历匹配没有命中,你可以内置一份Windows时区名到IANA时区标识符的固定映射表,查表拿到IANA标识符后,直接调用TimeZone(identifier:)完成初始化即可。常见映射关系如下:Pacific Standard Time→America/Los_AngelesEastern Standard Time→America/New_YorkCentral Standard Time→America/ChicagoMountain Standard Time→America/DenverChina Standard Time→Asia/ShanghaiGMT Standard Time→Europe/LondonTokyo Standard Time→Asia/Tokyo
注意:时区缩写存在大量重名冲突,但你拿到的全称格式重名概率极低,优先走系统内置名称匹配的方案准确率最高,映射表仅作为极端场景兜底即可。
内容的提问来源于stack exchange,提问作者TheRightWay
相关产品推荐
相关产品推荐

