我正在尝试在Swift中扩展TimeZone,以便我可以初始化它以随机给我一个TimeZone。我已经登陆了下面,但是有一些事情似乎是错的。
init?(random: Bool = false) {
if random {
let randomIdentifier = TimeZone.knownTimeZoneIdentifiers.randomElement()!
self.init(identifier: String(randomIdentifier))
} else {
return nil
}
}
首先,当我初始化一个随机元素并打印结果时,它似乎已经添加了“(固定)” - 这会导致什么?
其次,这甚至是解决这个问题的正确方法吗?看起来很奇怪,我甚至可以选择使用'false'进行初始化,因为其他初始化程序提供了所有其他非随机初始化。
任何想法将不胜感激!
时区很棘手,因为没有明确的标准,即使它看起来像是存在的。我偶然发现了这个问题并从Swift库中生成了这个列表:
"HST": "Pacific/Honolulu", -10
"AKST": "America/Juneau", -9
"AKDT": "America/Juneau", -9
"PDT": "America/Los_Angeles", -8
"PST": "America/Los_Angeles", -8
"MST": "America/Phoenix", -7
"MDT": "America/Denver", -7
"CDT": "America/Chicago", -6
"CST": "America/Chicago", -6
"PET": "America/Lima", -5
"COT": "America/Bogota", -5
"EDT": "America/New_York", -5
"EST": "America/New_York", -5
"AST": "America/Halifax", -4
"ADT": "America/Halifax", -4
"NST": "America/St_Johns", -330
"NDT": "America/St_Johns", -330
"CLST": "America/Santiago", -3
"ART": "America/Argentina/Buenos_Aires", -3
"CLT": "America/Santiago", -3
"BRT": "America/Sao_Paulo", -2
"BRST": "America/Sao_Paulo", -2
"GMT": "GMT", 0
"UTC": "UTC", 0
"WET": "Europe/Lisbon", 0
"BST": "Europe/London", 0
"WEST": "Europe/Lisbon", 0
"CEST": "Europe/Paris", +1
"CET": "Europe/Paris", +1
"WAT": "Africa/Lagos", +1
"EEST": "Europe/Athens", +2
"CAT": "Africa/Harare", +2
"EET": "Europe/Athens", +2
"MSK": "Europe/Moscow", +3
"MSD": "Europe/Moscow", +3
"TRT": "Europe/Istanbul", +3
"EAT": "Africa/Addis_Ababa", +3
"IRST": "Asia/Tehran", +330
"GST": "Asia/Dubai", +4
"PKT": "Asia/Karachi", +5
"IST": "Asia/Kolkata", +530
"BDT": "Asia/Dhaka", +6
"ICT": "Asia/Bangkok", +7
"WIT": "Asia/Jakarta", +7
"SGT": "Asia/Singapore", +8
"PHT": "Asia/Manila", +8
"HKT": "Asia/Hong_Kong", +8
"KST": "Asia/Seoul", +9
"JST": "Asia/Tokyo”, +9
"NZDT": "Pacific/Auckland", +13
"NZST": "Pacific/Auckland", +13
重复项显示了这些东西的“标准”程度。您可以根据您认为正确的内容策划自己的列表,并从该集合中生成合法的随机函数。
杰克答案的问题是Swift中的时区标识符不均匀;一些区域的代表性过高,而其他区域的代表性不足则基于斯威夫特在该区域认为有多少区域。澳大利亚有12个标识符,即使该国仅有3个时区。为了节省时间,您可以在-12小时和+14小时之间随机生成一个数字,并使用GMT的秒数返回时区。
extension TimeZone {
static var random: TimeZone? {
return TimeZone(secondsFromGMT: Int.random(in: -43200...50400))
}
}
if let t = TimeZone.random {
print(t)
}
如果你想要一个整齐的时区划分,只需将它们分成块,然后从该组中随机选择。只是意识到有一半和四分之一的时区;并非每个时区距其邻居都是干净的正负1小时。如果你采用这种方法,你的数组将有超过24个整数,这不应该让你担心。
一种解决方案可能是
extension TimeZone {
static var random: TimeZone? {
return TimeZone(identifier: TimeZone.knownTimeZoneIdentifiers.randomElement()!)
}
}
let random = TimeZone.random
random?.identifier // the name you're looking for
您甚至可以更改random
计算变量以返回非可选项,因为您可以确定knownTimeZoneIdentifiers
不为空。
static var random: TimeZone {
return TimeZone(identifier: TimeZone.knownTimeZoneIdentifiers.randomElement()!)!
}