代码之家  ›  专栏  ›  技术社区  ›  Raunak

从timeZoneOffset字符串创建时区对象?

  •  0
  • Raunak  · 技术社区  · 5 年前

    什么是一个干净的方式来初始化Swift TimeZone 来自timeZoneOffset字符串的对象,格式为:“+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")
    

    格林尼治标准时间-0730

    0 回复  |  直到 5 年前
        1
  •  2
  •   vadian    5 年前

    我的建议是使用 DateFormatter 它能够解析时区字符串格式。 refZoneString

    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")
    
        2
  •  0
  •   Leo Dabus    5 年前

    我不知道你说的清洁剂是什么意思,但你可以结合收集方法 suffix prefix 要避免使用字符串索引访问所需值,请执行以下操作:

    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