Ios UTC-12和UTC+是否有时区缩写;12?

Ios UTC-12和UTC+是否有时区缩写;12?,ios,cocoa,timezone,nstimezone,Ios,Cocoa,Timezone,Nstimezone,我正在解决一个问题,我想对NSDate进行计算,其中单个NSDate在不同的时区给出不同的dd/mm/yyyy值 为了做到这一点,我目前正在使用纽约市(EST)和新西兰奥克兰,因为他们经常在不同的日期 我希望能够使用国际日期行两侧的时区UTC+12和UTC-12。UTC+12(ANAT)和俄罗斯阿纳代尔(Anadyr)似乎有一个标准缩写。然而,TimeZone/NSTimeZone的iOS实现似乎没有识别出它。似乎也没有UTC-12的缩写(在阿拉斯加) 有人知道是否有iOS(或Mac OS)能识

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

为了做到这一点,我目前正在使用纽约市(EST)和新西兰奥克兰,因为他们经常在不同的日期

我希望能够使用国际日期行两侧的时区UTC+12和UTC-12。UTC+12(ANAT)和俄罗斯阿纳代尔(Anadyr)似乎有一个标准缩写。然而,TimeZone/NSTimeZone的iOS实现似乎没有识别出它。似乎也没有UTC-12的缩写(在阿拉斯加)


有人知道是否有iOS(或Mac OS)能识别的UTC+12和UTC-12的缩写吗?

答案似乎是否定的

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

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)")}
因此,看起来UTC-12、UTC-11、UTC-1、UTC+10、UTC+11和UTC+12在Cocoa中可用的“命名”时区中都缺失了

编辑: 根据@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)
}
struct timeZoneStruct:CustomStringConvertible{
let标识符:字符串
变量偏移量:Int
变量说明:字符串{
让displayOffset=字符串(格式:“%3d”,偏移量)
让displayIdentifier=(标识符+“,”)。填充(至长度:30,带填充:”,起始位置:0)
返回“标识符=\(显示标识符)偏移量=\(显示偏移量)”
}
}
让TimeZoneId=TimeZone.KnownTimeZoneId标识符
让mappedTimeZones:[timeZoneStruct]=时区ID
.map{中的标识符
var偏移量=0
如果let timeZone=时区(标识符:标识符){
offset=时区。secondsFromGMT()/3600
}
返回timeZoneStruct(标识符:标识符,偏移量:偏移量)}
.sorted{$0.offset<$1.offset}
mappedTimeZones.forEach{
打印($0.description)
}
这将产生一个时区列表,范围从UTC-11(太平洋/帕果帕果)到UTC+14(太平洋/阿皮亚)

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


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

看来答案是否定的

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

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)")}
因此,看起来UTC-12、UTC-11、UTC-1、UTC+10、UTC+11和UTC+12在Cocoa中可用的“命名”时区中都缺失了

编辑: 根据@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)
}
struct timeZoneStruct:CustomStringConvertible{
let标识符:字符串
变量偏移量:Int
变量说明:字符串{
让displayOffset=字符串(格式:“%3d”,偏移量)
让displayIdentifier=(标识符+“,”)。填充(至长度:30,带填充:”,起始位置:0)
返回“标识符=\(显示标识符)偏移量=\(显示偏移量)”
}
}
让TimeZoneId=TimeZone.KnownTimeZoneId标识符
让mappedTimeZones:[timeZoneStruct]=时区ID
.map{中的标识符
var偏移量=0
如果let timeZone=时区(标识符:标识符){
offset=时区。secondsFromGMT()/3600
}
返回timeZoneStruct(标识符:标识符,偏移量:偏移量)}
.sorted{$0.offset<$1.offset}
mappedTimeZones.forEach{
打印($0.description)
}
这将产生一个时区列表,范围从UTC-11(太平洋/帕果帕果)到UTC+14(太平洋/阿皮亚)

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


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

这是获取所有时区及其各自缩写的最简单方法。 并不是所有的时区都有三个字母的缩写

 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个三字母缩写:

  print(TimeZone.abbreviationDictionary.count)

您还可以探索更多信息。

这是获取所有时区及其各自缩写的最简单方法。 并不是所有的时区都有三个字母的缩写

 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个三字母缩写:

  print(TimeZone.abbreviationDictionary.count)

您还可以探索更多信息。

不要使用时区缩写。它们是高度不可靠和不一致的。改用IANA TZ标识符。@MattJohnson,好的,似乎有一个时区类函数knownTimeZoneIdentifiers给了我一个所有标识符的数组。然后我可以使用它依次加载每个时区并获得它们的偏移量。请阅读,特别是标题为“时区!=Offset”的部分。这是一个常见的错误。时区有点像美国/纽约。一年中部分时间的偏移量为UTC-5,其他时间的偏移量为UTC-4。此外,您可能需要查看。不要使用时区缩写。它们是高度不可靠和不一致的。改用IANA TZ标识符。@MattJohnson,好的,似乎有一个时区类函数knownTimeZoneIdentifiers给了我一个所有标识符的数组。然后我可以使用它依次加载每个时区并获得它们的偏移量。请阅读,特别是标题为“时区!=Offset”的部分。这是一个常见的错误。时区有点像美国/纽约。一年中部分时间的偏移量为UTC-5,其他时间的偏移量为UTC-4。此外,您可能需要查看。贝克岛无人居住,因此它没有基于位置的时区ID。如果要将那里的时区描述为有效的T