タイムゾーン識別子を廃止名から正規名へ更新(Europe/Kyiv・Asia/Yangon)
ActiveSupport::TimeZone::MAPPING 内の2つのタイムゾーン識別子を、IANA tzdbの廃止名から正規名へ置き換えました。これにより、最新のtzdata環境でタイムゾーンが正しく解決されるようになります。
背景
特定のLinuxディストリビューションでは、廃止されたIANAタイムゾーン識別子がzoneinfo以下から削除されており、ActiveSupportのタイムゾーン解決が失敗するケースが発生していました。先行PRである #55494 が America/Godthab を America/Nuuk へ置き換えた経緯からも分かるとおり、この問題はグリーンランドのタイムゾーンだけに留まりません。#55494 では、Debian Trixieにおいて /usr/share/zoneinfo/ から America/Godthab が削除されたことにより ActiveSupport::TimeZone.find_tzinfo('Greenland') が失敗するという具体的な副作用が報告されており、同様のリスクが他の廃止識別子にも存在します。
廃止されたタイムゾーン識別子は以下のコードで検出できます。
ActiveSupport::TimeZone::MAPPING.keys.select { ActiveSupport::TimeZone.new(it).nil? }
この検出手法により、今回の対象として Europe/Kiev と Asia/Rangoon の2識別子が特定されました。
技術的な変更
activesupport/lib/active_support/values/time_zone.rb 内の MAPPING ハッシュで、2つのIANA識別子が正規名へ更新されました。
変更前:
"Kyiv" => "Europe/Kiev",
"Rangoon" => "Asia/Rangoon",
変更後:
"Kyiv" => "Europe/Kyiv",
"Rangoon" => "Asia/Yangon",
変更点は次の2つです:
-
Europe/Kiev→Europe/Kyiv: 廃止された識別子Europe/Kievを正規のEurope/Kyivに更新 -
Asia/Rangoon→Asia/Yangon: 廃止された識別子Asia/Rangoonを正規のAsia/Yangonに更新
Railsが公開するActiveSupport側のキー名("Kyiv"・"Rangoon")はそのまま維持されており、アプリケーションから ActiveSupport::TimeZone["Kyiv"] や ActiveSupport::TimeZone["Rangoon"] で参照している既存コードへの影響はありません。
設計判断
ActiveSupport側のキー名を変えずに、値のIANA識別子のみを更新する方式 が採用されました。
Railsの MAPPING は「人間が読みやすい名前」から「IANAのtzdb識別子」へのマッピングです。アプリケーションコードが依存するのは前者のキー名であり、後者のIANA識別子はtzinfoライブラリとの橋渡しに過ぎません。そのため、IANAの正規化に追従しながらも既存のAPIインターフェースを保つ本アプローチは、互換性を損なわない最小変更として合理的です。
まとめ
本PRは、IANAのtzdbにおける正規識別子への追従を徹底し、最新のtzdataを採用したOSやディストリビューションでActiveSupportのタイムゾーン解決が壊れないようにする修正です。America/Nuuk への置き換え (#55494) を皮切りに、廃止識別子を体系的に除去していく取り組みの一環として位置づけられます。