Rails应用程序不遵循config / application.rb中配置的时区

问题描述 投票:1回答:1

我是新手来配置时区并对几点感到困惑。任何有关正确配置的建议都将受到赞赏。

我的理解是,最佳做法是将所有时间戳作为UTC存储在DB中(我正在使用PostgreSQL)。另一方面,在实际的应用程序中,我想在我的本地时区看到时间戳(JST +9:00)。我已经像这样配置了config/application.rb

module MyApp
  class Application < Rails::Application
    config.load_defaults 5.2
    config.time_zone = 'Tokyo'
  end
end

但是,我不确定它的配置是否正确,因为我在rails console中得到了混合的结果。 Time.zoneTime.now告诉我时区设置为JST,但created_atupdated_at时间戳在我执行User.first时呈现为UTC。

User.first
#=> #<User id: 1, first_name: "Bob", last_name: "Smith", created_at: "2019-04-09 08:54:30", updated_at: "2019-04-09 08:54:30"> 

但是,如果我特别要求created_at时间,那么时间将呈现为JST:

User.first.created_at
#=> Tue, 09 Apr 2019 17:54:30 JST +09:00

为什么时间戳呈现为UTC,除非我特别要求时间本身?这是正常的吗?在我的其他表格中,DateTime列也出现了同样的现象。

ruby-on-rails postgresql timezone utc
1个回答
1
投票

您的所有日期似乎都是相同的,只是它们在不同背景下的表现方式。

这个:

User.first
#=> #<User id: 1, first_name: "Bob", last_name: "Smith", created_at: "2019-04-09 08:54:30", updated_at: "2019-04-09 08:54:30">

呈现.inspect的结果

这个:

User.first.created_at
#=> Tue, 09 Apr 2019 17:54:30 JST +09:00

是控制台猜测您希望使用当前时区格式化日期。

您可以强制某些表示是明确的

User.first.created_at.to_formatted_s(:db) #should print the same as you see on the inspect
I18n.localize(User.first.created_at) #should localize the date with the default date format
I18n.localize(USer.first.created_at, format: :something) #should localize the date as the format you defined as ":something" on your locale file
© www.soinside.com 2019 - 2024. All rights reserved.