这个 Swift TimeZone 作为另一个时区假设中的日期缩写有什么问题?

问题描述 投票:0回答:1

在具有以下 Swift 代码的 Xcode Playground 中,我得到了带注释的输出。给定 MST TimeZone 对象和该 MST TimeZone 的 MDT TimeZone 中的日期,我没有收到预期的 MDT TimeZone 缩写输出。我对这个函数有什么不理解的地方?在给定当前示例 MST 时区的情况下,如何获得所需的输出来确定给定日期位于两个可能时区中的哪一个?

// Daylight saving time (MDT) 2021 in Colorado began at 2:00 AM on Sunday, March 14
let mstDate = Date(timeIntervalSinceReferenceDate: 636327068) // "Mar 1, 2021 at 2:31 PM"
let mdtDate = Date(timeIntervalSinceReferenceDate: 637709468) // "Mar 17, 2021 at 3:31 PM"
let mstTimeZone = TimeZone(abbreviation: "MST")!
let mdtTimeZone = TimeZone(abbreviation: "MDT")!

mstTimeZone.abbreviation(for: mstDate) // expected MST, got MST
mstTimeZone.abbreviation(for: mdtDate) // expected MDT, got *****MST*****?

mdtTimeZone.abbreviation(for: mstDate) // expected MST, got MST
mdtTimeZone.abbreviation(for: mdtDate) // expected MDT, got MDT
swift xcode date timezone timezone-offset
1个回答
6
投票

不要依赖时区缩写。 MST 的意思是“山地标准时间”,但它被解释为亚利桑那州凤凰城(“美国/菲尼克斯”),而不是科罗拉多州丹佛(“美国/丹佛”)。您应该始终使用时区标识符,而不是不明确的缩写。时区标识符不会根据日期而改变。您需要的是检查所需日期/时区是否是夏令时,并根据它获取时区本地化名称:

extension TimeZone {
    static let denverCO = Self(identifier: "America/Denver")!
    func localizedName(for date: Date) -> String { localizedName(for: isDaylightSavingTime(for: date) ? .daylightSaving : .standard, locale: .current) ?? "" }
    func localizedNameShort(for date: Date) -> String { localizedName(for: isDaylightSavingTime(for: date) ? .shortDaylightSaving : .shortStandard, locale: .current) ?? "" }
}

let mst = Date(timeIntervalSinceReferenceDate: 636327068) // "Mar 1, 2021 at 2:31 PM"
let mdt = Date(timeIntervalSinceReferenceDate: 637709468) // "Mar 17, 2021 at 3:31 PM"

TimeZone.denverCO.localizedName(for: mst)  // "Mountain Standard Time"
TimeZone.denverCO.localizedName(for: mdt)  // "Mountain Daylight Time"

TimeZone.denverCO.localizedNameShort(for: mst)  // "MST"
TimeZone.denverCO.localizedNameShort(for: mdt)  // "MDT"
© www.soinside.com 2019 - 2024. All rights reserved.