为什么不`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_zoneTime.zone ,那么可以说EST,Rails预计,如果将date时间属性设置为该时间和date的时间属于指定时区,则为EST。 这就是为什么您将Time.zone设置为等于最终用户时区,以便他们可以使用他们的本地时间和date,并且可以直接将它们传递到ActiveRecord模型,Rails可以将其转换为UTC以存储在数据库中。

这有帮助吗?

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