问题
How can a method take the current Time.zone and put it into a format that is usable by ActiveSupport::TimeZone[some_zone].parse()?
It seems very strange that Time.zone.to_s returns a string that can not be used with ActiveSupport::TimeZone[zone].parse()
Time.zone.to_s returns "(GMT-08:00) Pacific Time (US & Canada)"
But ActiveSupport::TimeZone["(GMT-08:00) Pacific Time (US & Canada)"] is nil.
ActiveSupport::TimeZone["(GMT-08:00) Pacific Time (US & Canada)"]
=> nil
ActiveSupport::TimeZone["Pacific Time (US & Canada)"]
=> (GMT-08:00) Pacific Time (US & Canada)
回答1:
Use Time.zone.name, not Time.zone.to_s
[1] pry(main)> Time.zone.to_s
=> "(GMT-05:00) Eastern Time (US & Canada)"
[2] pry(main)> Time.zone.name
=> "Eastern Time (US & Canada)"
[3] pry(main)> ActiveSupport::TimeZone[Time.zone.name]
=> (GMT-05:00) Eastern Time (US & Canada)
As for how I got this (as requested), I just know the name method exists on Time.zone. If I didn't know this by heart though, I will check the docs. If it's not in there as you say (and it is, here), I typically inspect the class/module/object with Pry. Pry is an alternative to irb that lets me do something like
[1] pry(main)> cd Time.zone
[2] pry(#<ActiveSupport::TimeZone>):1> ls -m
Comparable#methods: < <= == > >= between?
ActiveSupport::TimeZone#methods: <=> =~ at formatted_offset local local_to_utc name now parse period_for_local period_for_utc to_s today tzinfo utc_offset utc_to_local
self.methods: __pry__
[3] pry(#<ActiveSupport::TimeZone>):1> name
=> "Eastern Time (US & Canada)"
ls -m on line [2] above prints methods on the object (if you scroll right you'll see name listed there). You can see in [3] I can call name directly on the Time.zone object I'm inside of and get the output you're looking for.
来源:https://stackoverflow.com/questions/13887643/in-rails-how-get-current-time-zone-time-zone-in-a-format-that-can-be-used-wit