为什么`config.time_zone`似乎没有做任何事情?

Zab*_*bba 21 ruby-on-rails ruby-on-rails-3

application.rb,它说:

将Time.zone默认设置为指定区域,并将Active Record自动转换为此区域.运行"rake -D time"以获取用于查找时区名称的任务列表.默认为UTC.

但是设置config.time_zone = 'Central Time (US & Canada)'或者config.time_zone = 'Eastern Time (US & Canada)'没有效果 - created_at模型中的字段是以UTC格式保存的.

根据这个railsforum回答:

config.time_zone只是让rails知道你的服务器被设置为这个时区,所以当它将日期写入数据库时​​,它可以正确地将它转换为UTC.

如果这是真的,那么它为什么,当我的系统时间Pacific Time (US & Canada)config.time_zone = 'Central Time (US & Canada)'config.time_zone = 'Eastern Time (US & Canada)',该created_at时间是正确的UTC?它应该不正确吗?!

因为,如果PST时间是晚上8点,则EST是晚上11点,UTC是凌晨4点.假设Rails确实如此Time.now,那将是晚上8点.我们告诉Rails服务器在EST中.因此,就Rails而言,晚上8点将是EST时间,然后UTC将是UTC时间上午5点,这将是不正确的(因为实际时间是太平洋标准时间晚上8点/美国东部时间晚上11点,即UTC时间上午4点)

这里发生了什么?

ctc*_*rry 46

以下是可能对您有所帮助的概念和事项列表:

config.time_zone 不设置"服务器时间",通常由您的操作系统控制.

Rails始终将您的日期以UTC格式存储在数据库中(除非您更改其他设置).

Time.now在您的时区中返回计算机的本地时间,它还包括操作系统的本地时区偏移量,这意味着Ruby和Rails知道如何将localtime转换为UTC.您可以irb直接使用,因此不会加载任何Rails库:

ctcherry$ irb
>> Time.now
=> Mon Feb 21 20:53:14 -0800 2011
>> 
Run Code Online (Sandbox Code Playgroud)

如果config.time_zone或者Time.zone设置为允许说EST,Rails预计如果你设置一个datetime属性,你指的是该时间和日期在指定的时区,在这种情况下是EST.这就是为什么你将Time.zone设置为等于你的最终用户时区,这样他们就可以使用他们的本地时间和日期,你可以将它们直接传递给你的ActiveRecord模型,Rails可以将它转换为UTC存储在数据库中.

这些帮助有用?


Pau*_*ber 15

您需要使用in_time_zone(即Time.now.in_time_zone)获得除UTC之外的其他内容.

  • 您也可以使用Time.zone.now (2认同)
  • 或时间.当前。同样令人困惑的是,Date.current 尊重时区设置,而 Date.today 由系统时钟确定。 (2认同)