Ruby:将“美国/东部”时区名称转换为“中部时间(美国和加拿大)”

时间:2011-11-02 15:27:00

标签: ruby-on-rails ruby timezone

我有一个旧的数据库,其时区格式如下:

US/Eastern
Australia/Melbourne

在我的新Rails应用程序中,我将它们保存为:

Eastern Time (US & Canada)
Melbourne

如何将旧版本转换为新版本?我一直在忙着使用ActiveSupport :: TimeZone,但无法弄清楚从一个到另一个的正确组合。

我希望我可以创建一个新对象,然后返回新格式化的名称,但它只返回我给它的名称。例如:

> tz = ActiveSupport::TimeZone.new("US/Eastern")
=> (GMT-05:00) US/Eastern
> tz.name
=> "US/Eastern"

提前致谢!

1 个答案:

答案 0 :(得分:4)

这非常难看,但这是我发现的唯一方法:

city = TZInfo::Timezone.get('US/Eastern').instance_eval('@linked_timezone').name
ActiveSupport::TimeZone::MAPPING.invert[city]

修改

要使此代码与城市或区域一起使用,您可以执行以下操作:

zone = TZInfo::Timezone.get(zone_name)
city = (zone.instance_eval('@linked_timezone') || zone).name
ActiveSupport::TimeZone::MAPPING.invert[city]