インドを代表する都市カルカッタは、従来英語風の呼び方であったが2001年にベンガル語風のコルカタと呼ぶように改められた。それに伴い、当地のタイムゾーン名を"Asia/Calcutta" から "Asia/Kolkata" に変更した。

iOSのタイムゾーン名もiOS10SDKでは "Asia/Kolkata" が使われていたが、なぜだかiOS11SDKでは"Asia/Calcutta" に戻されていた

でそのことについてバグレポートを送ったところ、すぐに回答があった。


バグレポートの内容

With iOS11 SDK, TimeZone.knownTimeZoneIdentifiers returns "Asia/Calcutta", but does not return "Asia/Kolkata".
I beleive that "Asia/Calcutta" has been deemed obsolete and replaced with "Asia/Kolkata".
So We need "Asia/Kolkata" instead of "Asia/Calcutta".


回答はそのまま掲載してもいいかわからないので、要約したもの


knownTimeZoneIdentifiers は、完全なリストじゃないよ。 tz database zone.tab に基づいて計算しているから心配しなくていいよ。

・完全なリストはここを見てね。こっちでも同じだけど。

・tz database についてはここが詳しいよ。

でも、リファレンスマニュアルにはそんなこと書いていないけど。

knownTimeZoneIdentifiers
Returns an array of strings listing the identifier of all the time zones known to the system.

Declaration
static var knownTimeZoneIdentifiers: [String] { get }


例えば下記のコードのように、knownTimeZoneIdentifiers で出てこなくても内部ではどっちも持っているから心配なく使ってね。
guard let tz = TimeZone(identifier: "Asia/Kolkata") else { fatalError() } 
print(tz) // => Asia/Kolkata (fixed)  
guard let tz2 = TimeZone(identifier: "Asia/Calcutta") else { fatalError() } 
print(tz2) // => Asia/Culcatta (fixed)  
print(tz.secondsFromGMT() == tz2.secondsFromGMT()) // => true


なので、knownTimeZoneIdentifiersでは見つからなくてもICUで定義されているのは全部使えるよってこと。

knownTimeZoneIdentifiers は例示程度のものなのかな。