Reputation: 43
Rails 5.2.3
I have a date:
"Apr-03-2013 17:47:00"
I have a date zone:
"America/Los_Angeles"
I am trying to turn it into a string:
"Apr-03-2013 17:47:00 Pacific Daylight Time (GMT-07)"
The best I can come up with is:
time_obj = ActiveSupport::TimeZone["America/Los_Angeles"].parse("2013-04-03 17:47:00")
Time.at(time_obj).strftime("%b-%d-%Y %H:%M:%S %Z")
Which gives me:
"Apr-03-2013 17:47:00 PDT"
Any ideas?
Upvotes: 2
Views: 1164
Reputation: 101
I believe you need custom logic and/or you own database of timezones to get it exactly like that.
Using %Z
with strftime
is going to give you what ever your OS likes and there are a few disclaimers in the ruby docs.
One idea that you might get some mileage out of: If you are starting with a time zone identifier like "America/Los_Angeles" then you can use ActiveSupport::TimeZone::MAPPING to get a friendlier name, or at least a Rails time zone name.
eg:
ActiveSupport::TimeZone::MAPPING.key("America/Los_Angeles")
=> "Pacific Time (US & Canada)"
But that won't work for every identifier:
ActiveSupport::TimeZone::MAPPING.key("America/Detroit")
=> nil
You can see which ones will map like this:
TZInfo::Country.get('US').zone_identifiers.map {|ident| [ident, ActiveSupport::TimeZone::MAPPING.key(ident)] }
So in that case you need to fall back to the identifier you have, or perhaps this approach might work.
Then you'd need to deal with the daylight savings part, here you can use dst?
ActiveSupport::TimeZone["America/Los_Angeles"].parse("2013-04-03 17:47:00").dst?
Then you'd need to splice all that together! ... and add the offset as well.
Upvotes: 3