如何在Swift中正确扩展TimeZone以初始化随机元素?

问题描述 投票:0回答:2

我正在尝试在Swift中扩展TimeZone,以便我可以初始化它以随机给我一个TimeZone。我已经登陆了下面,但是有一些事情似乎是错的。

   init?(random: Bool = false) {
    if random {
        let randomIdentifier = TimeZone.knownTimeZoneIdentifiers.randomElement()!
        self.init(identifier: String(randomIdentifier))
    } else {
        return nil
    }
}

首先,当我初始化一个随机元素并打印结果时,它似乎已经添加了“(固定)” - 这会导致什么?

其次,这甚至是解决这个问题的正确方法吗?看起来很奇怪,我甚至可以选择使用'false'进行初始化,因为其他初始化程序提供了所有其他非随机初始化。

任何想法将不胜感激!

ios swift timezone nstimezone
2个回答
0
投票

时区很棘手,因为没有明确的标准,即使它看起来像是存在的。我偶然发现了这个问题并从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个整数,这不应该让你担心。


3
投票

一种解决方案可能是

extension TimeZone {
    static var random: TimeZone? {
        return TimeZone(identifier: TimeZone.knownTimeZoneIdentifiers.randomElement()!)
    }
}

let random = TimeZone.random
random?.identifier // the name you're looking for

Result

您甚至可以更改random计算变量以返回非可选项,因为您可以确定knownTimeZoneIdentifiers不为空。

static var random: TimeZone {
    return TimeZone(identifier: TimeZone.knownTimeZoneIdentifiers.randomElement()!)!
}
© www.soinside.com 2019 - 2024. All rights reserved.