「America/Los_Angeles」を「Pacific Time (US & Canada)」に変換する方法については、すでに質問があります。ただし、「US/Pacific」およびその他の廃止されたタイム ゾーンを Rails TimeZone に変換したいと考えています。これを達成するのに役立つライブラリが見つかりません。
3 に答える
Rails ActiveSupport::TimeZone ドキュメントから:
Active Support にバンドルされている TZInfo のバージョンには、TimeZone クラスによって定義されたゾーンをサポートするために必要な定義のみが含まれています。TimeZone で定義されていないゾーンを使用する必要がある場合は、TZInfo gem をインストールする必要があります (gem の最新バージョンがローカルにインストールされている場合は、バンドルされたバージョンの代わりにこれが使用されます)。
個人的には、Rails のタイム ゾーンはばかげていると思います。それらは、Rails が「146 ゾーンの意味のあるサブセット」として説明するものに任意に制限されます。しかし、どのゾーンが「意味のある」ゾーンで、どのゾーンが破棄されるかをどのように判断するかについては、何も説明していません。
「US/Pacific」などの識別子は、TZDB データでは「リンク」または「エイリアス」として知られています。おそらく Rails から省略されている可能性があることはわかりましたが、実際には他にも多くのタイム ゾーンが完全に欠落しています。
Rails のタイム ゾーン識別子を実際に目にした唯一の場所は、Twitter API です。一方、IANA/TZDB 識別子はいたるところにあります。
私が提供できる最善のアドバイスは、Rails のタイム ゾーンのことは忘れて、Ruby TZInfo Gemを直接使用することです。エイリアスを含むすべてのゾーンを含む完全な TZDB 実装があります。
本当に Rails ゾーンを引き続き使用する必要がある場合は、まず TZInfo を使用してエイリアスを実際のゾーンに解決し、そのゾーンが RailsMAPPING
ディクショナリにあるかどうかを確認します。例えば:
"US/Pacific" => "America/Los_Angeles" (via TZInfo)
"America/Los_Angeles" => "Pacific Time (US & Canada)" (via Rails MAPPING)
TZInfo 経由で「US/Pacific」を読み込むと、LinkedTimezoneInfo
オブジェクトとしてサブクラス化されるので、link_to_identifier
そこから属性を使用できると思います。
このコマンドでは、144 のタイムゾーン名が表示されます。
ActiveSupport::TimeZone.zones_map