为什么不`config.time_zone`似乎做任何事情?
在application.rb
,它说:
将Time.zone默认设置为指定的区域,并使活动logging自动转换为该区域。 运行“耙 – D时间”以查找时区名称的任务列表。 默认是UTC。
但设置config.time_zone = 'Central Time (US & Canada)'
或config.time_zone = 'Eastern Time (US & Canada)'
没有任何影响 – 模型中的created_at
字段仍然以UTC保存。
根据这个railsforum的回答 :
config.time_zone只是让轨道知道你的服务器设置为这个时区,所以当它将date写入数据库时,它可以正确地将其转换为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。 所以,下午8点会是EST时间,就Rails而言,那么UTC会在UTC时间上午5点,这是不正确的(因为实际时间是PST晚上8点/下午11点,即上午4点UTC)
这里发生了什么?
这里有一些概念和事情可以帮助你:
config.time_zone
没有设置“服务器时间”,通常由您的操作系统控制。
Rails在数据库中总是用UTC来存储你的date(除非你改变了一个不同的设置)。
Time.now
在您的时区返回您的计算机的本地时间,它还包括您的操作系统的本地时区偏移,这意味着Ruby,因此Rails知道如何将本地时间转换为UTC。 你可以直接使用irb
来试试,所以没有加载Rails库:
ctcherry$ irb >> Time.now => Mon Feb 21 20:53:14 -0800 2011 >>
如果设置了config.time_zone
或Time.zone
,那么可以说EST,Rails预计,如果将date时间属性设置为该时间和date的时间属于指定时区,则为EST。 这就是为什么您将Time.zone设置为等于最终用户时区,以便他们可以使用他们的本地时间和date,并且可以直接将它们传递到ActiveRecord模型,Rails可以将其转换为UTC以存储在数据库中。
这有帮助吗?
您需要使用in_time_zone
(即Time.now.in_time_zone
)来获得UTC以外的其他内容。