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

时间:2011-02-22 04:15:50

标签: 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格式保存。

根据this railsforum answer

  

config.time_zone只是让铁路知道   您的服务器设置为此   时区所以当它写日期时   它可以正确转换的数据库   它到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点)

这里发生了什么?

2 个答案:

答案 0 :(得分:45)

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

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
>> 

如果设置了config.time_zoneTime.zone,让我们说EST,Rails希望如果你设置一个datetime属性,你的意思是该时间和日期在指定的时区,在这种情况下美东时间。这就是为什么你将Time.zone设置为你的最终用户时区,这样他们就可以使用他们的本地时间和日期,你可以将它们直接传递给你的ActiveRecord模型,Rails可以将它转换成UTC存储在数据库中。

这有帮助吗?

答案 1 :(得分:14)

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