从rails中的TimeZone检索城市名称

时间:2015-03-27 06:19:05

标签: ruby-on-rails ruby datetime timezone

我按照here

所述设置了我的默认时区
class Application < Rails::Application
 config.time_zone = "Asia/Kolkata"
end

现在从rails控制台我可以将时区设为IST但是我想获得此时区的标识符(Asia/Kolkata)。

这是我得到的:

 > Time.zone.name # work for this
 => "Asia/Kolkata" 
 > Time.now.zone
 => "IST" 
 > Time.now.zone.name # this doesn't work
 => NoMethodError: undefined method `name' for "IST":String

现在我在这里遇到麻烦:

 > b
 => 2015-03-13 16:38:12 +0530
 > b.zone
 => "IST"
 > b.zone.name
NoMethodError: undefined method `name' for "IST":String

有没有办法从对象zone.name中检索Asia/Kolkata(此处b)。

注意:我不仅仅想要这个IST时区。但对于普遍的时区。这只是一个样本。有什么方法或宝石可以解决我的问题吗?感谢您的帮助和指导。

更新

如果我在application.rb中定义timezone,那么PrakshMurthy的asnwer是正确的。但我不想要特定的时区。所以我必须在 application.rb 中指定而不指定。请帮帮我。

3 个答案:

答案 0 :(得分:4)

这是您正在寻找的内容(未在 application.rb 中指定特定timezone

   > b
   => 2015-03-13 16:38:12 +0530
   > getutc = b.utc_offset
   => 19800
   > tz_names = ActiveSupport::TimeZone.zones_map.values.collect{|z| z.tzinfo.name if z.utc_offset == getutc}.compact!
   => ["Asia/Kolkata", "Asia/Kolkata", "Asia/Kolkata", "Asia/Kolkata", "Asia/Colombo"] 
   > tz_names.first
   => "Asia/Kolkata" 

现在您不必在 application.rb 中指定默认时区。 :)

答案 1 :(得分:3)

这应该有效:b.in_time_zone.time_zone

答案 2 :(得分:0)

b.time_zone.name

由于您的b类似于Time.zone.now,而b.time_zone.name给出了Asia/Kolkatab.time_zone.name.to_s也给出相同的结果。