【问题标题】:Are there time zone abbreviations for UTC-12 and UTC+12?UTC-12 和 UTC+12 是否有时区缩写?
【发布时间】:2017-06-30 12:47:14
【问题描述】:

我正在解决一个问题,我想对 NSDate 进行计算,其中单个 NSDate 在不同时区给出不同的 dd/mm/yyyy 值。

为此,我目前使用的是纽约市 (EST) 和新西兰奥克兰,因为它们经常在不同的日期。

我希望能够使用国际日期变更线、UTC+12 和 UTC-12 两侧的时区。似乎有一个标准的 UTC+12 缩写,ANAT,代表俄罗斯的阿纳德尔。但是,TimeZone/NSTimeZone 的 iOS 实现似乎无法识别它。似乎也没有 UTC-12 的缩写(在阿拉斯加)。

有谁知道 iOS(或 Mac OS,就此而言)是否有这样的 UTC+12 和 UTC-12 缩写?

【问题讨论】:

  • 不要使用时区缩写。它们非常不可靠且不一致。请改用 IANA TZ 标识符。
  • @MattJohnson,好的,似乎有 TimeZone 类函数 knownTimeZoneIdentifiers 为我提供了所有标识符的数组。然后我可以使用它依次加载每个时区并获取它们的偏移量。
  • 请阅读the timezone tag wiki,特别是标题为“时区!=偏移”的部分。这是一个常见的错误。时区类似于America/New_York。它的偏移量将在一年中的部分时间为 UTC-5,在一年中的其他时间点为 UTC-4。

标签: ios cocoa timezone nstimezone


【解决方案1】:

看起来答案是否定的。

我编写了一些代码来获取所有系统时区,按偏移量对其进行排序,然后打印出来:

typealias timeZoneTuple = (abbreviation: String, name: String, offset: Int)

let timeZones = TimeZone.abbreviationDictionary
let mappedTimeZones: [timeZoneTuple] = timeZones
  .map {key, value in
    var offset = 0
    if let timeZone = TimeZone(abbreviation: key) {
      offset = timeZone.secondsFromGMT() / 3600
      
    }
    return (abbreviation: key, name: value, offset:offset)}
  .sorted {$0.offset < $1.offset}
mappedTimeZones.forEach {
  let abbreviation = $0.abbreviation.padding(toLength: 4, withPad: " ", startingAt: 0)
  let name = $0.name.padding(toLength: 20, withPad: " ", startingAt: 0)
  print("abbreviation = \(abbreviation), offset = \(name), val = \($0.offset)")}

以上代码的输出为:

abbreviation = HST , offset = Pacific/Honolulu    , val = -10
abbreviation = AKDT, offset = America/Juneau      , val = -9
abbreviation = AKST, offset = America/Juneau      , val = -9
abbreviation = PST , offset = America/Los_Angeles , val = -8
abbreviation = PDT , offset = America/Los_Angeles , val = -8
abbreviation = MDT , offset = America/Denver      , val = -7
abbreviation = MST , offset = America/Denver      , val = -7
abbreviation = CDT , offset = America/Chicago     , val = -6
abbreviation = CST , offset = America/Chicago     , val = -6
abbreviation = EDT , offset = America/New_York    , val = -5
abbreviation = PET , offset = America/Lima        , val = -5
abbreviation = EST , offset = America/New_York    , val = -5
abbreviation = COT , offset = America/Bogota      , val = -5
abbreviation = ADT , offset = America/Halifax     , val = -4
abbreviation = AST , offset = America/Halifax     , val = -4
abbreviation = CLT , offset = America/Santiago    , val = -3
abbreviation = CLST, offset = America/Santiago    , val = -3
abbreviation = ART , offset = America/Argentina/Bu, val = -3
abbreviation = BRST, offset = America/Sao_Paulo   , val = -2
abbreviation = BRT , offset = America/Sao_Paulo   , val = -2
abbreviation = GMT , offset = GMT                 , val = 0
abbreviation = WET , offset = Europe/Lisbon       , val = 0
abbreviation = BST , offset = Europe/London       , val = 0
abbreviation = WEST, offset = Europe/Lisbon       , val = 0
abbreviation = UTC , offset = UTC                 , val = 0
abbreviation = CEST, offset = Europe/Paris        , val = 1
abbreviation = WAT , offset = Africa/Lagos        , val = 1
abbreviation = CET , offset = Europe/Paris        , val = 1
abbreviation = CAT , offset = Africa/Harare       , val = 2
abbreviation = MSD , offset = Europe/Moscow       , val = 3
abbreviation = EAT , offset = Africa/Addis_Ababa  , val = 3
abbreviation = IRST, offset = Asia/Tehran         , val = 3
abbreviation = MSK , offset = Europe/Moscow       , val = 3
abbreviation = EET , offset = Europe/Istanbul     , val = 3
abbreviation = EEST, offset = Europe/Istanbul     , val = 3
abbreviation = GST , offset = Asia/Dubai          , val = 4
abbreviation = IST , offset = Asia/Calcutta       , val = 5
abbreviation = PKT , offset = Asia/Karachi        , val = 5
abbreviation = BDT , offset = Asia/Dhaka          , val = 6
abbreviation = WIT , offset = Asia/Jakarta        , val = 7
abbreviation = ICT , offset = Asia/Bangkok        , val = 7
abbreviation = SGT , offset = Asia/Singapore      , val = 8
abbreviation = HKT , offset = Asia/Hong_Kong      , val = 8
abbreviation = PHT , offset = Asia/Manila         , val = 8
abbreviation = KST , offset = Asia/Seoul          , val = 9
abbreviation = JST , offset = Asia/Tokyo          , val = 9
abbreviation = NZDT, offset = Pacific/Auckland    , val = 13
abbreviation = NZST, offset = Pacific/Auckland    , val = 13

因此,在 Cocoa 中可用的“命名”时区中似乎都缺少 UTC-12、UTC-11、UTC-1、UTC+10、UTC+11 和 UTC+12。

编辑:

根据@MattJohnson 的评论,标识符似乎是获取可用时区列表的更好方法。修改我的代码以使用标识符:

struct timeZoneStruct: CustomStringConvertible {
  let identifier: String
  var offset: Int
  
  var description: String {
    let displayOffset = String(format: "%3d", offset)
    let displayIdentifier = (identifier + ",").padding(toLength: 30, withPad: " ", startingAt: 0)
    return "identifier = \(displayIdentifier) offset = \(displayOffset)"
  }
}
  
  
let timeZoneIDs = TimeZone.knownTimeZoneIdentifiers
let mappedTimeZones: [timeZoneStruct] = timeZoneIDs
  .map {identifier in
    var offset = 0
    if let timeZone = TimeZone(identifier: identifier) {
      offset = timeZone.secondsFromGMT() / 3600
    }
    return timeZoneStruct(identifier: identifier, offset: offset)}
  .sorted {$0.offset < $1.offset}
mappedTimeZones.forEach {
  print($0.description)
}

这会产生一个时区列表,范围从 UTC-11 (Pacific/Pago_pago) 到 UTC+14 (Pacific/Apia)

(大多数时区都有很多重复,因此列表太长,无法在此处列出。)

因此,从 UTC-11 到 UTC+14 的偏移似乎有定义的时区。然而,没有 UTC-12 的时区,尽管贝克岛在纬度/经度:0°12'N / 176°29'W,在 UTC-12 中。好奇。

【讨论】:

  • 贝克岛无人居住,因此无法获得基于地区的时区 ID。如果要将那里的时区描述为有效的 TZ 标识符,那将是航海管理区Etc/GMT+12。 (这种形式的符号是倒置的。)
  • 另外,您的代码一定有问题,因为您为标准和日光缩写显示相同的偏移量,并且您提到的某些偏移量确实存在基于位置的时区,例如Atlantic/Cape_Verde 是 UTC-1,Pacific/Midway 是 UTC-11,等等
  • 最后,请记住,这些缩写中的许多都是发明出来的,并且在最近版本的 TZ 数据库中逐渐被它们的数字等价物所取代。所以你会发现很多区域根本没有真正的“缩写”。有关这方面的更多信息,请参阅iana.org/time-zones 的最近讨论/公告邮件列表
【解决方案2】:

这是获取所有时区及其各自缩写的最简单方法。 P.S 并非所有时区都有其正确的 3 字母缩写。

 let timezoneList = NSTimeZone.knownTimeZoneNames
    for i in 0...timezoneList.count - 1 {
    let locale = NSTimeZone.init(name: timezoneList[i])
    print("Region: \((locale?.name)!) Abbr: \((locale?.abbreviation)!)")
  }

还存在总共 51 个 3 字母缩写:

  print(TimeZone.abbreviationDictionary.count)

您还可以探索https://developer.apple.com/documentation/foundation/timezone 了解更多信息。

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 2020-10-21
    • 2012-12-17
    • 1970-01-01
    • 2011-01-21
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多