时区很棘手,因为没有明确的标准,尽管看起来好像有。不久前我遇到了这个问题,并从 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
副本向您展示了这些东西是多么“标准”。您可以根据您认为正确的内容整理自己的列表,并从该集合中生成合法的随机发生器。
Jack 回答的问题在于 Swift 中的时区标识符是不均匀的;根据 Swift 认为该区域受欢迎的地区数量,一些地区的代表人数过多,而另一些地区的代表人数不足。例如,尽管澳大利亚只有 3 个时区,但澳大利亚有 12 个标识符。为了节省时间,您可以随机生成一个介于 -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 个整数,您不必担心。