Làm cách nào để thay đổi múi giờ mặc định cho Active Record in Rails?


140

Trong tôi, application.rbtôi đã xem qua các bình luận sau đây

# 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)'

Như bạn thấy ở trên, tôi đã thực hiện config.time_zoneđến giờ EST. Tuy nhiên, vẫn khi các bản ghi được tạo trong DB, có vẻ như datetimenó đang được lưu trữ ở định dạng UTC.

Trong nhận xét trên, họ nói

... và tự động chuyển đổi Active Record sang vùng này ...

Làm thế nào tôi có thể làm điều đó, và ở đâu?

Ngoài ra, tôi cũng sẽ triển khai nó trên heroku và tôi muốn cài đặt tiếp tục


Trong MySQL datetime là loại không có múi giờ. Tức là nó có thể ở bất kỳ múi giờ nào bạn muốn. Nếu bạn coi nó là UTC thì tốt. Nhưng hãy cẩn thận nếu ai đó nhìn trực tiếp vào cơ sở dữ liệu của bạn và diễn giải nó theo cách khác.
Vanuan

Câu trả lời:


199

Tôi đã quyết định biên soạn câu trả lời này bởi vì tất cả những người khác dường như không đầy đủ.

config.active_record.default_timezone xác định nên sử dụng Time.local (nếu được đặt thành: local) hoặc Time.utc (nếu được đặt thành: utc) khi kéo ngày và giờ từ cơ sở dữ liệu. Mặc định là: utc. http://guides.rubyonrails.org/configuring.html


Nếu bạn muốn thay đổi múi giờ Rails , nhưng tiếp tục lưu Active Record trong cơ sở dữ liệu trong UTC , hãy sử dụng

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'

Nếu bạn muốn thay đổi múi giờ Rails có thời gian lưu trữ Bản ghi hoạt động trong múi giờ này, hãy sử dụng

# application.rb
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local

Cảnh báo : bạn thực sự nên suy nghĩ hai lần, thậm chí ba lần, trước khi lưu thời gian trong cơ sở dữ liệu ở định dạng không phải UTC.

Lưu ý
Đừng quên khởi động lại máy chủ Rails của bạn sau khi sửa đổi application.rb.


Hãy nhớ rằng chỉ config.active_record.default_timezonecó thể mất hai giá trị

  • : local (chuyển đổi thành múi giờ được xác định trong config.time_zone)
  • : utc (chuyển đổi sang UTC)

Đây là cách bạn có thể tìm thấy tất cả các múi giờ có sẵn

rake time:zones:all

5
Đây có vẻ như là câu trả lời đầy đủ / chính xác nhất - @Om Toàn diện
Aegix

2
Đây phải là câu trả lời được chấp nhận. Nó là đầy đủ hơn.
Lều Enrique Moreno

@ Mihai-AndreiDinculescu Bạn có nghĩ rằng tốt hơn là lưu trữ các datetimegiá trị trong UTC trong cơ sở dữ liệu và sau đó chỉ cần thay đổi chúng ở lối vào như với moment.jshoặc bạn gợi ý gì để hiển thị dữ liệu này theo múi giờ chính xác cho bất kỳ người dùng nào?
alexventuraio

@AlexVentura Vâng, mọi người thông minh hơn tôi đã đồng ý từ lâu rằng lưu trữ ngày trong UTC là cách tốt nhất để đi.
Mihai-Andrei Dinculescu

Vâng tôi đã có được nó. Nhưng bạn có đề xuất gì để thực hiện trong chế độ xem đường ray để hiển thị các giá trị chính xác cho bất kỳ người dùng nào có múi giờ khác nhau?
alexventuraio

187

thêm vào sau để application.rblàm việc

 config.time_zone = 'Eastern Time (US & Canada)'
 config.active_record.default_timezone = :local # Or :utc

59
Nó hoạt động với tôi với điều này:config.time_zone = 'London' config.active_record.default_timezone = :local
Dean Perry

41
Bạn có thể thấy tất cả các múi giờ bằng cách chạy nó trong rails c-ActiveSupport::TimeZone.all.map(&:name)
Dean Perry

5
Cám ơn rất nhiều! Tôi cũng đang vật lộn với điều này. Tôi có một ứng dụng PHP kế thừa được kế thừa, tương tác với cùng một cơ sở dữ liệu mysql và lưu trữ mọi lúc như cục bộ; cập nhật nó để sử dụng UTC không phải là một lựa chọn. Những gì trước đây tôi đã không làm được gì: config.time_zone = 'Central Time (US & Canada)' config.active_record.default_timezone = 'Central Time (US & Canada)' nhưng đặt nó thành: biểu tượng cục bộ đã làm được điều đó.
Matt Hucke

8
Các hướng dẫn đường ray nói rằng config.active_record.default_timezonechỉ nên được đặt thành :localhoặc :utc. Tôi cho rằng bất cứ điều gì khác sẽ có kết quả bất ngờ.
Kelvin

2
Bạn có thể thấy tất cả các múi giờ bằng cách chạy nó trongrake time:zones:all
Orlando

34

Tôi đã đi đến kết luận giống như Dean Perry sau nhiều nỗi thống khổ. config.time_zone = 'Adelaide'config.active_record.default_timezone = :locallà sự kết hợp chiến thắng. Đây là những gì tôi tìm thấy trong quá trình.


5
Đây là câu trả lời đúng, default_timezone chỉ chấp nhận: local hoặc: utc
Francesco Belladonna

20

Trong trường hợp của tôi (Rails 5), cuối cùng tôi đã thêm 2 dòng này vào app/config/environments/development.rb

config.time_zone = "Melbourne"
config.active_record.default_timezone = :local

Đó là nó! Và để chắc chắn rằng Melbourne đã được đọc chính xác, tôi đã chạy lệnh trong thiết bị đầu cuối của mình:

bundle exec rake time:zones:all

và Melbourne đã được liệt kê trong múi giờ tôi đang ở!


Điều gì xảy ra nếu tôi muốn mọi người dùng thấy các giá trị thời gian trong múi giờ của riêng họ?
alexventuraio

@AlexVentura khi bạn hiển thị giá trị thời gian cho người dùng của mình, chuyển đổi nó thành múi giờ của họ. Làm cho các bản ghi cơ sở dữ liệu liên tục là một thực hành tốt hơn
Waheed

10

Nếu bạn muốn đặt múi giờ thành UTC trên toàn cầu, bạn có thể thực hiện các thao tác sau trong Rails 4:

# Inside config/application.rb
config.time_zone = "UTC"
config.active_record.default_timezone = :utc

Hãy chắc chắn để khởi động lại ứng dụng của bạn hoặc bạn sẽ không thấy những thay đổi.


3

Trên đường ray 4.2.2, hãy đến application.rbvà sử dụng config.time_zone='city'(ví dụ: 'London' hoặc 'Bucharest' hoặc 'Amsterdam', v.v.).

Nó nên hoạt động tốt. Nó làm việc cho tôi.


3

Tôi đã phải thêm khối này vào environment.rbtập tin của mình và tất cả đều ổn :)

Rails.application.configure do
    config.time_zone = "Pacific Time (US & Canada)"
    config.active_record.default_timezone = :local
end
  • Tôi đã thêm nó trước dòngRails.application.initialize!

1

Đối với người dùng Trung Quốc, chỉ cần thêm hai dòng dưới đây cho bạn config/application.rb:

config.active_record.default_timezone = :local
config.time_zone = 'Beijing'

0

Trong Ruby on Rails 6.0.1, hãy đi tới cấu hình > ngôn ngữ > ứng dụng.rb y agrega lo siguiente:

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

Bạn có thể thấy rằng tôi đang cấu hình múi giờ với 2 dòng:

config.active_record.default_timezone =: local
config.time_zone = 'Lima'

Tôi hy vọng nó sẽ giúp những người đang làm việc với Ruby on Rails 6.0.1


-2

Nếu bạn muốn đặt giờ địa phương, hãy thêm văn bản sau vào 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

Sau đó khởi động lại máy chủ của bạn


12
default_timezone chấp nhận một trong hai tùy chọn ..: local hoặc: utc .. nó không chấp nhận múi giờ cụ thể, vì vậy điều này sẽ không hoạt động .. bạn cần đặt default_timezone thành: local
Urkle
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.