How to change default timezone for Active Record in Rails?
Ruby on-RailsRubyTimezoneRails ActiverecordRuby on-Rails Problem Overview
In my application.rb
I came across the following comment
# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
config.time_zone = 'Eastern Time (US & Canada)'
As you see from above, I've made config.time_zone
to EST time. However, still when records are created in the DB, it looks like datetime
is being stored in UTC format.
In the above comment, they say
> ...and make Active Record auto-convert to this zone...
How can I do that, and where?
Also, I'll be deploying this on heroku as well and i'd like the setting to carry over
Ruby on-Rails Solutions
Solution 1 - Ruby on-Rails
I have decided to compile this answer because all others seem to be incomplete.
> config.active_record.default_timezone determines whether to use Time.local (if set to :local) or Time.utc (if set to :utc) when pulling dates and times from the database. The default is :utc. > http://guides.rubyonrails.org/configuring.html
If you want to change Rails timezone, but continue to have Active Record save in the database in UTC, use
# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
If you want to change Rails timezone AND have Active Record store times in this timezone, use
# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local
Warning: you really should think twice, even thrice, before saving times in the database in a non-UTC format.
> Note
> Do not forget to restart your Rails server after modifying application.rb
.
Remember that config.active_record.default_timezone
can take only two values
- :local (converts to the timezone defined in
config.time_zone
) - :utc (converts to UTC)
Here's how you can find all available timezones
rake time:zones:all
Solution 2 - Ruby on-Rails
adding following to application.rb
works
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local # Or :utc
Solution 3 - Ruby on-Rails
I came to the same conclusion as Dean Perry after much anguish. config.time_zone = 'Adelaide'
and config.active_record.default_timezone = :local
was the winning combination. Here's what I found during the process.
Solution 4 - Ruby on-Rails
In my case (Rails 5), I ended up adding these 2 lines in my app/config/environments/development.rb
config.time_zone = "Melbourne"
config.active_record.default_timezone = :local
That's it! And to make sure that Melbourne was read correctly, I ran the command in my terminal:
bundle exec rake time:zones:all
and Melbourne was listing in the timezone I'm in!
Solution 5 - Ruby on-Rails
If you want to set the timezone to UTC globally, you can do the following in Rails 4:
# Inside config/application.rb
config.time_zone = "UTC"
config.active_record.default_timezone = :utc
Be sure to restart your application or you won't see the changes.
Solution 6 - Ruby on-Rails
I had to add this block to my environment.rb
file and all was well :)
Rails.application.configure do
config.time_zone = "Pacific Time (US & Canada)"
config.active_record.default_timezone = :local
end
- I added it before the line
Rails.application.initialize!
Solution 7 - Ruby on-Rails
In Ruby on Rails 6.0.1 go to config > locales > application.rb and add the following:
require_relative 'boot'
require 'rails/all'
# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)
module CrudRubyOnRails6
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 6.0
config.active_record.default_timezone = :local
config.time_zone = 'Lima'
# Settings in config/environments/* take precedence over those specified here.
# Application configuration can go into files in config/initializers
# -- all .rb files in that directory are automatically loaded after loading
# the framework and any gems in your application.
end
end
You can see that I am configuring the time zone with 2 lines:
config.active_record.default_timezone =: local
config.time_zone = 'Lima'
I hope it helps those who are working with Ruby on Rails 6.0.1
Solution 8 - Ruby on-Rails
On rails 4.2.2, go to application.rb
and use config.time_zone='city'
(e.g.:'London' or 'Bucharest' or 'Amsterdam' and so on).
It should work just fine. It worked for me.
Solution 9 - Ruby on-Rails
for Chinese user, just add two lines below to you config/application.rb
:
config.active_record.default_timezone = :local
config.time_zone = 'Beijing'
Solution 10 - Ruby on-Rails
If you want local time to set, add the following text in application.rb
config.time_zone = 'Chennai'
# WARNING: This changes the way times are stored in the database (not recommended)
config.active_record.default_timezone = :local
Then restart your server