在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格式保存。
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点)
这里发生了什么?
答案 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_zone
或Time.zone
,让我们说EST,Rails希望如果你设置一个datetime属性,你的意思是该时间和日期在指定的时区,在这种情况下美东时间。这就是为什么你将Time.zone设置为你的最终用户时区,这样他们就可以使用他们的本地时间和日期,你可以将它们直接传递给你的ActiveRecord模型,Rails可以将它转换成UTC存储在数据库中。
这有帮助吗?
答案 1 :(得分:14)
您需要使用in_time_zone
(即Time.now.in_time_zone
)来获取UTC之外的其他内容。