无法从TimeZone.abbreviation()

我通过存储日期组件字典将用户的出生日期存储在我的后端。看起来像这样:

{
    "day": 1,"month": 1,"year": 1970,"timeZone": "GMT"
}

要存储此对象,它将从用户输入中获取用户的出生日期,月份和年份。但是,用户时区是通过TimeZone.current.abbreviation()收集的。

现在,我后端的某些用户生日对象的"timeZone"格式为"CST""BST""PDT"。以此方式格式化的"timeZone"分别通过TimeZonelet timeZone = TimeZone(abbreviation: "CST")!let timeZone = TimeZone(abbreviation: "BST")!成功地在前端初始化了let timeZone = TimeZone(abbreviation: "PDT")!

问题是,我后端上的其他用户生日对象的"timeZone"格式为"GMT+8"。尝试通过"timeZone"初始化格式为let timeZone = TimeZone(abbreviation: "GMT+8")!的{​​{1}}时,初始化返回nil。我也尝试过let timeZone = TimeZone(identifier: "GMT+8")!,但这也会返回nil

在格式化TimeZone时,是否有一种方法可以初始化TimeZone,相对于其相对于GMT的偏移量(而不是其唯一的缩写)?我见过一个TimeZone(secondsFromGMT: Int)的{​​{1}}初始化程序。我可以简单地从8中提取"GMT+8"并乘以3600(一小时的秒数)并将结果传递到TimeZone(secondsFromGMT: Int)吗?

h5531856138 回答:无法从TimeZone.abbreviation()

我最终编写了适合我的应用的代码,以解决这些意外情况,其中TimeZone的缩写格式为"GMT+8"而不是"SGT"。我创建了TimeZone的扩展名:

extension TimeZone {
    static func timeZone(from string: String) -> TimeZone {
        //The string format passed into this function should always be similar to "GMT+8" or "GMT-3:30"

        if string.contains("±") {
            //This case should always be "GMT±00:00",or simply GMT
            return TimeZone(secondsFromGMT: 0)!
        } else {

            //If the string doesn't contain "±",then there should be some offset. We will split the string into timeZone components. "GMT+8" would split into ["GMT","8"]. "GMT-3:30" would split int ["GMT","3","30"]
            let timeZoneComponents = string.components(separatedBy: CharacterSet(charactersIn: "+-:"))
            var isAheadOfGMT: Bool!

            //Check if the string contains "+". This will dictate if we add or subtract seconds from GMT
            if string.contains("+") {
                isAheadOfGMT = true
            } else {
                isAheadOfGMT = false
            }

            //Grab the second element in timeZoneElements. This represents the offset in hours
            let offsetInHours = Int(timeZoneComponents[1])!

            //Convert these hours into seconds
            var offsetInSeconds: Int!
            if isAheadOfGMT {
                offsetInSeconds = offsetInHours * 3600
            } else {
                offsetInSeconds = offsetInHours * -3600
            }

            //Check if there is a colon in the passed string. If it does,then there are additional minutes we need to account for
            if string.contains(":") {
                let additionalMinutes = Int(timeZoneComponents[2])!
                let additionalSeconds = additionalMinutes * 60
                offsetInSeconds += additionalSeconds
            }

            //Create a TimeZone from this calculated offset in seconds
            let timeZoneFromOffset = TimeZone(secondsFromGMT: offsetInSeconds)!

            //Return this value
            return timeZoneFromOffset
        }
    }
}

它的用法如下:

let json: [String:String] = ["timeZone":"GMT+8"]
let timeZone = json["timeZone"]
let birthDate: BirthDate!
if let timeZoneFromAbbrev = TimeZone(abbreviation: timeZone) {
    birthDate = BirthDate(day: birthDay,month: birthMonth,year: birthYear,timeZone: timeZoneFromAbbrev)
} else {       
    let timeZoneFromOffset = TimeZone.timeZone(from: timeZone)
    print(timeZoneFromOffset.abbreviation())
    //Prints "GMT+8"

    birthDate = BirthDate(day: birthDay,timeZone: timeZoneFromOffset)
}

我的BirthDate类上下文:

class BirthDate {
    var day: Int
    var month: Int
    var year: Int
    var timeZone: TimeZone

    init(day: Int,month: Int,year: Int,timeZone: TimeZone) {
        self.day = day
        self.month = month
        self.year = year
        self.timeZone = timeZone
    }
}

时区很有趣。如果有人发现上述TimeZone扩展名有问题,请告诉我。我认为我已经考虑了所有情况,但可能会误会。

本文链接:https://www.f2er.com/3157113.html

大家都在问