从 timeZoneOffset 字符串创建 TimeZone 对象?

Create TimeZone object from timeZoneOffset string?

从以下形式的 timeZoneOffset 字符串初始化 Swift TimeZone 对象的干净方法是什么:"+HH:MM".

我正在寻找以下形式的内容:

extension TimeZone {

    init?(UTCOffsetString ofs: String) {

        let signIndex = ofs.firstIndex(of: "+") ?? ofs.firstIndex(of: "-")
        let sign = ofs[signIndex!]

        let separatorIndex = ofs.firstIndex(of: ":")!

        let hhRange = ofs.index(signIndex!, offsetBy: 1)..<separatorIndex
        let hh = ofs[hhRange]

        let mmRange = ofs.index(separatorIndex, offsetBy: 1)..<ofs.index(separatorIndex, offsetBy: 3)
        let mm = ofs[mmRange]

        var offsetInMin = (Int(String(hh))! * 60) + Int(String(mm))!
        if sign == "-" {
            offsetInMin.negate()
        }

        let offsetInSec = offsetInMin * 60
        // Convert string to TimeZone, eg.
        self.init(secondsFromGMT: offsetInSec)
    }

}

let tz = TimeZone.init(UTCOffsetString: "-07:30")
print(tz?.identifier ?? "unknown")

以上代码块是正确的解决方案并打印:

GMT-0730

但是我正在寻找一种更简洁的解决方案,我不需要提取子字符串来计算偏移量。

我不知道你所说的清洁器是什么意思,但你可以结合收集方法 suffixprefix 以避免需要使用字符串索引来访问所需的值:

let time = "-02:00"
let hours = Int(time.suffix(5).prefix(2)) ?? 0
let minutes = Int(time.suffix(2)) ?? 0

var offset = hours * 3600 + minutes * 60   
if time.first == "-" { offset = -offset }

print(offset)  // -7200 

我的建议是使用能够解析时区字符串格式的DateFormatterrefZoneString 是对当前时区 UTC 的引用。

extension TimeZone {

    init?(UTCOffsetString ofs: String) {
        let refZoneString = "+0000"
        let formatter = DateFormatter()
        formatter.dateFormat = "Z"
        guard let refDate = formatter.date(from: refZoneString),
            let date = formatter.date(from: ofs) else { return nil }
        self.init(secondsFromGMT: Calendar.current.dateComponents([.second], from: date, to: refDate).second!)
    }
}

let tz = TimeZone.init(UTCOffsetString: "-07:30")
print(tz?.identifier ?? "unknown")