Duncan C
Duncan C

Reputation: 131408

Are there time zone abbreviations for UTC-12 and UTC+12?

I'm working on a problem where I want to do calculations on NSDates where a single NSDate gives different dd/mm/yyyy values in different time zones.

To do that I'm currently using New York City (EST) and Aukland, NZ, since they are frequently on different dates.

I'd like to be able to use the time zones on either side of the international date line, UTC+12, and UTC-12. There appears to be a standard abbreviation for UTC+12, ANAT, for Anadyr, Russia. However, the iOS implementation of TimeZone/NSTimeZone doesn't seem to recognize it. There also does not seem to be an abbreviation for UTC-12 (which would be in Alaska).

Does anybody know if there are such abbreviations for UTC+12 and UTC-12 that iOS (or Mac OS, for that matter) recognizes?

Upvotes: 1

Views: 2161

Answers (2)

Sarthak Sharma
Sarthak Sharma

Reputation: 246

This is the simplest way to get all timezones with their respective abbreviation. P.S Not all timezones have their proper 3-Letter Abbreviations.

 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)!)")
  }

Also total 51, 3-lettered Abbreviations are present:

  print(TimeZone.abbreviationDictionary.count)

You can also explore https://developer.apple.com/documentation/foundation/timezone for more.

Upvotes: 0

Duncan C
Duncan C

Reputation: 131408

It looks like the answer is no.

I wrote some code to fetch all the system time zones, sort them by offset, and print them:

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)")}

The output of the above code is:

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

So it looks like UTC-12, UTC-11, UTC-1, UTC+10, UTC+11, and UTC+12 are all missing from the "named" timezones that are available in Cocoa.

EDIT:

Based on a comment from @MattJohnson, it seems that the identifiers is a better way to get the list of available time zones. Modifying my code to use identifiers instead:

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)
}

That yields a list of time zones ranging from UTC-11 (Pacific/Pago_pago) to UTC+14 (Pacific/Apia)

(There are quite a few duplicates for most time zones, so the list is too long to include here.)

So it seems there are defined time zones for offsets from UTC-11 to UTC+14. There is not a time zone for UTC-12 however, even though Baker Island, at Lat/Long: 0°12'N / 176°29'W, is in UTC-12. Curious.

Upvotes: 0

Related Questions