从 TimeZone.abbreviation() 初始化时区时出现问题
Trouble Initializing TimeZone from TimeZone.abbreviation()
我通过存储日期组件字典在我的后端存储用户出生日期。它看起来像这样:
{
"day": 1,
"month": 1,
"year": 1970,
"timeZone": "GMT"
}
为了存储此对象,它从用户输入中获取用户的生日、月份和年份。然而,用户时区是通过 TimeZone.current.abbreviation()
.
收集的
现在,我后端的一些用户生日对象的 "timeZone"
格式为 "CST"
、"BST"
或 "PDT"
。 "timeZone"
以这种方式格式化的 TimeZone
分别通过 let timeZone = TimeZone(abbreviation: "CST")!
、let timeZone = TimeZone(abbreviation: "BST")!
或 let timeZone = TimeZone(abbreviation: "PDT")!
在前端成功初始化了一个 TimeZone
。
问题是,我后端的其他用户生日对象的 "timeZone"
格式为 "GMT+8"
。当尝试通过 let timeZone = TimeZone(abbreviation: "GMT+8")!
初始化 "timeZone"
s 格式时,初始化 returns nil
。我也试过 let timeZone = TimeZone(identifier: "GMT+8")!
,但是这个 returns nil
也是。
当 TimeZone
的格式是相对于 GMT 的偏移量而不是其独特的缩写时,有没有办法初始化它?我见过一个 TimeZone
初始化程序,它是 TimeZone(secondsFromGMT: Int)
。我可以简单地从 "GMT+8"
中取出 8
并将其乘以 3600
(一小时中的秒数)并将此结果传递给 TimeZone(secondsFromGMT: Int)
吗?
我最终编写了代码来调整我的应用程序以解决这些意外的边缘情况,其中 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, month: birthMonth, year: birthYear, timeZone: timeZoneFromOffset)
}
我的 BirthDate
class 上下文:
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
扩展名有问题,请告诉我。我想我已经考虑了所有情况,但可能是错误的。
我通过存储日期组件字典在我的后端存储用户出生日期。它看起来像这样:
{
"day": 1,
"month": 1,
"year": 1970,
"timeZone": "GMT"
}
为了存储此对象,它从用户输入中获取用户的生日、月份和年份。然而,用户时区是通过 TimeZone.current.abbreviation()
.
现在,我后端的一些用户生日对象的 "timeZone"
格式为 "CST"
、"BST"
或 "PDT"
。 "timeZone"
以这种方式格式化的 TimeZone
分别通过 let timeZone = TimeZone(abbreviation: "CST")!
、let timeZone = TimeZone(abbreviation: "BST")!
或 let timeZone = TimeZone(abbreviation: "PDT")!
在前端成功初始化了一个 TimeZone
。
问题是,我后端的其他用户生日对象的 "timeZone"
格式为 "GMT+8"
。当尝试通过 let timeZone = TimeZone(abbreviation: "GMT+8")!
初始化 "timeZone"
s 格式时,初始化 returns nil
。我也试过 let timeZone = TimeZone(identifier: "GMT+8")!
,但是这个 returns nil
也是。
当 TimeZone
的格式是相对于 GMT 的偏移量而不是其独特的缩写时,有没有办法初始化它?我见过一个 TimeZone
初始化程序,它是 TimeZone(secondsFromGMT: Int)
。我可以简单地从 "GMT+8"
中取出 8
并将其乘以 3600
(一小时中的秒数)并将此结果传递给 TimeZone(secondsFromGMT: Int)
吗?
我最终编写了代码来调整我的应用程序以解决这些意外的边缘情况,其中 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, month: birthMonth, year: birthYear, timeZone: timeZoneFromOffset)
}
我的 BirthDate
class 上下文:
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
扩展名有问题,请告诉我。我想我已经考虑了所有情况,但可能是错误的。