Search code examples
ruby-on-railsruby-on-rails-3timezoneruby-on-rails-3.2utc

How to deal with UTC times and Rails/ActiveRecord


I'm using Rails 3.2.8. When I generate a scaffold with a time field or datetime field. The HTML form field gets pre-populated with the current date/time in UTC. Great that it's pre-populated with the current date/time, but because it's in UTC, we have to change the time back 7 hours every time (which will sometimes require setting the day back 1 also, possibly month and year too). And then it seems the UTC time gets stored in the database, so I'll have issues displaying/editing it as well if I recorded it in our local time.

I looked at the Ruby documentation for the form helpers to deal with local time better, but I don't see anything relevant.

What's the best way to deal with editing and displaying dates and times in Rails?

UPDATE: To clarify, I like the idea that UTC time is stored in the database. I just want the time_select and datetime_select form helpers to edit the times in the user's local timezone. And, of course, I want to easily display the time in the user's local timezone.


Solution

  • You have to set the time zone to display on a per-user basis somewhere in a before/around_filter. This has to be done like:

    Time.zone = "Kyiv"
    

    An example can be found in its API: http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D.

    Run the rake time:zones:all to see all of them.

    All the conversions has to be handled for you behind the scene.