List the time zones for a Country - ruby-on-rails

I am looking for the code that displays list of countries/regions in ruby on rails when selecting a specific country/region, it displays the time zone of it. For example when i choose “United Kingdom" as country/region then it should displays “(GMT +00:00)London" as Time Zone. My application runs on Rails 3.2.11. I am displaying all the countries using countries gem and all the time zones using ActiveSupport::TimeZone. I want to know if Ruby on Rails provide this functionality by default or if there is any other possible way to achieve this.

In Rails 5.2 this is simple: ActiveSupport::TimeZone.country_zones("US")

You can use TimeZone class. You can get all timezones list by:
zones_hash = ActiveSupport::TimeZone::MAPPING
And you can get time zone of any country as the following:
country_zone = ActiveSupport::TimeZone.new("Europe/Skopje")
country_zone.formatted_offset
The output: +01:00 for the above example.

Related

TimeZone convertion in Ruby on Rails

Im my application.rb I've set: config.time_zone = 'Brasilia'. It's ok when I save datetimes in the system. The problem is that I receive datetimes from another system that is already on the correct timezone. So, when this datetime is saved on my RoR system, it's being saved wrongly. Example: The another system sends a datetime 2015-11-10 15:07:00 (that is already on the right timezone, ready to save). But my RoR saves it like 2015-11-10 13:07:00 -0200. Is there a way to tell Rails that this datetime is already on the correct timezone?
You need to tell Rails/Ruby which timezone the incoming datetime is in, see a list of timezones using rake time:zones:all and then use the right one in the following code, eg.
Time.use_zone("Montevideo") { Time.zone.parse "2015-11-10 15:07:00" }
That will return an ActiveSupport::TimeWithZone object with the correct timezone set, and then you'll just store it in your DB and Rails will convert it to the correct UTC time.

How to get tzinfo from ActiveSupport::TimeZones.zones_map?

I'm trying to retrieve an array of all time zones tzinfo but I only need the "America/Los_Angeles" part from each so I can validate timezones being received from an iOS mobile client. Currently running the following:
ActiveSupport::TimeZone.zones_map.values.collect { |z| z.tzinfo }
I get the class TZInfo::TimezoneProxy along with the info I need.
Try following code:
ActiveSupport::TimeZone::MAPPING.values
The zones in ActiveSupport::Timezones are limited to a subset of 146 "meaningful" zones, though they do not define by what critera they determine which zones are "meaningful".
If you use it to validate IANA time zone identifiers coming from another platform, you will certainly have false negatives, as there are over 500 of them.
Instead, use the TZinfo Gem directly, rather than Rail's strange mutated version of it. See also the section on Rails Time Zone Identifiers in the timezone tag wiki.
Found the instance method "identifier" in the documentation - http://www.rubydoc.info/gems/tzinfo/TZInfo/TimezoneProxy#_load-class_method
So all I needed was
ActiveSupport::TimeZone.zones_map.values.collect{|z| z.tzinfo.identifier }

time_select with 12 hour time and Time Zone in Ruby on Rails

I have the need to capture a time and time zone from users of a rails 2.3.8 app, but have been unable to think of a clean solution to create and parse the selections.
Ideally I would have a drop-down menus for the following:
hour (1-12)
minute (0-59)
AM/PM
Time Zone
Is there a gem/plugin that accomplishes what I am looking for? Will I need to store both the time and time zone in the database? What is the best strategy for storage?
I'll eventually need to spit these values out in UTC, but a user should be able to go back and review the time in the correct time zone.
You can get time zone selects with the appropriate methods:
time_zone_options_for_select
time_zone_select
Similarly, there's date_select for dates.
Storage:
If the timezone is specific to the user and doesn't change, then store their time zone in their user record and set it when you load the current_user. Rails will convert times to/from UTC and always store UTC in the database and do the automatic convert to that default timezone for you (including daylight savings!). Easiest way to do it.
use_zone(zone) lets you override the default zone for a block, so you can accept a form value and set it with that function and set your value in that block.
UPDATE: I wrote up some Rails timezone examples as a blog entry.
I personally used jQuery to change the display only:
ampm = ["12 AM","01 AM","02 AM","03 AM","04 AM","05 AM","06 AM","07 AM","08 AM","09 AM","10 AM","11 AM","12 PM","01 PM","12 PM","01 PM","02 PM","01 PM","02 PM","03 PM","04 PM","05 PM","06 PM","07 PM","08 PM","09 PM","10 PM","11 PM"]
j("#game_start_time_4i option").each(function(index,value){
j(value).html(ampm[index]);
});
Rails:
<%= datetime_select('game', 'start_time') %>

why is the datetime in database different when I output it?

In my database on heroku, it shows contactemail.created_at = "2010-08-08 17:16:19"
However, when I use puts.contactemail.created_at I get something different. I get:
2010-08-08 10:11:13 -0700
I need to input that value through an API to another application, and I am pretty sure that the first format is what it wants. If it doesn't take that, it wants 08/08/10 17:16:19 -- in either case, I don't know how to format it properly.
This is in Ruby on Rails.
The display of date is based on your servers locale settings. If you are looking for the first format you could try
puts.contactemail.created_at.to_s(:db)
Have a look at strftime doc here http://ruby-doc.org/core/classes/Time.html#M000298 to get the second format
HTH
Ruby on rails can manage different time zones.
You can:
Make a direct sql consult (rails have some helpers)
Make that the two dates be equals, configuring config.active_record.default_timezone

How to return my current time zone in RoR?

When I use return the time that the record created, it show this :
2010-01-20 15:04:40 UTC
but I want the time in my specify time zone, for example, China. Is there any convenient method in RoR?
Configure your time zone in config/environment.rb to have Rails cast all timestamps to this time zone.
config.time_zone = 'Berlin'
As an alternative you can always use something like
Time.utc(2000).in_time_zone('Alaska')
See the documentation here.
Take a look at the TimeZone and TimeWithZone classes. They add time zone support. There's also been some additions to the Time and DateTime classes that also help deal with time zones. The documentation is given here: http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html.
There's also an excellent post here giving some extra details: http://ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones

Resources