如何检索澳大利亚的所有时区

时间:2018-04-10 06:41:38

标签: ruby-on-rails timezone

Rails version 5.2.rc1

我正试图通过以下

获取澳大利亚的所有时区

ActiveSupport::TimeZone.country_zones('AU')

但这只会在墨尔本没有完全列出

后返回
    <select class="select">
    <option value=""></option>
    <option value="Adelaide">Adelaide</option>
    <option value="Antarctica/Macquarie">Antarctica/Macquarie</option>
    <option value="Australia/Broken_Hill">Australia/Broken_Hill</option>
    <option value="Australia/Currie">Australia/Currie</option>
    <option value="Australia/Eucla">Australia/Eucla</option>
    <option value="Australia/Lindeman">Australia/Lindeman</option>
    <option value="Australia/Lord_Howe">Australia/Lord_Howe</option>
    <option value="Brisbane">Brisbane</option>
    <option value="Canberra">Canberra</option>
    <option value="Darwin">Darwin</option>
    <option value="Hobart">Hobart</option>
    <option value="Perth">Perth</option>
    <option value="Sydney">Sydney</option>

</select>

如果我能说出所有相关的AU区域,我会非常感激。但我找不到办法。任何帮助指针将不胜感激。

"Australian Eastern Standard Time (e.g. Sydney)"

1 个答案:

答案 0 :(得分:2)

这有点复杂,但我会尽力解释。

当您致电ActiveSupport::TimeZone.country_zones('AU')时,它会执行ActiveSupport::TimeZone#load_country_zonessource)。

load_country_zones
1)迭代TZInfo::Country.get(code).zone_identifiers
2)使用MAPPING hash映射区域标识符。

第二点至关重要,因为墨尔本失踪了。

TZInfo::Countru.get('AU').zone_identifiers的回复是:

[
 "Australia/Lord_Howe",
 "Antarctica/Macquarie",
 "Australia/Hobart",
 "Australia/Currie",
 "Australia/Melbourne",
 "Australia/Sydney",
 "Australia/Broken_Hill",
 "Australia/Brisbane",
 "Australia/Lindeman",
 "Australia/Adelaide",
 "Australia/Darwin",
 "Australia/Perth",
 "Australia/Eucla"
]

Australia/Melbourne在那里。但是,当看一下MAPPING哈希值时,您会看到两个键具有相同的值 - Australia/Melbourne

"Canberra" => "Australia/Melbourne"
"Melbourne" => "Australia/Melbourne"

因此,当ActiveSupport通过调用

获取Australia/Melbourne的密钥时
self[MAPPING.key('Australia/Melbourne')]

它返回Canberra而不是Melbournefirst matched key)。

总结一下 - 没有Melbourne,但Melbourne中使用了时区。它的名称不同。