从timeZoneOffset字符串创建TimeZone对象?

时间:2019-07-31 12:36:21

标签: swift timezone-offset

从timeZoneOffset字符串中初始化“ {H}:MM”形式的Swift TimeZone对象的干净方法是什么。

我正在寻找某种形式的东西:

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

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

2 个答案:

答案 0 :(得分:2)

我的建议是使用DateFormatter能够解析时区字符串格式。 refZoneString是当前时区对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")

答案 1 :(得分:0)

我不知道您所说的清洁剂是什么意思,但是您可以结合使用收集方法suffixprefix来避免使用String索引访问所需值的情况:

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 
相关问题