使用activerecord时Time.now的值不同

时间:2014-06-06 02:47:52

标签: mysql ruby-on-rails activerecord

我有这种奇怪的情况:

当我在rails控制台Time.nowTime.zone.now上执行操作时,我得到相同的值(假设它们在sime时间运行:2014-06-05 23:38:06 -0300

但是当我在查询中使用Time.now时:Match.where("datetime = ?", Time.now)它会提前3小时返回!

.to_sql输出:

SELECT `matches`.* FROM `matches`  WHERE (datetime = '2014-06-06 02:38:06')

对此的任何想法?

  • Rails 4
  • Mysql 5.5

2 个答案:

答案 0 :(得分:2)

那些是同一时期。一个的UTC偏移量为-3,另一个的是UTC时间,没有偏移量。

答案 1 :(得分:1)

您在sql查询中看到的时间是 UTC 时间。您在rails控制台中同时返回Time.nowTime.zone.now的原因是因为您的系统和rails应用程序都在同一时区。 Time.now根据系统时区返回系统时间,Time.zone.now返回应用程序的时区感知时间。

就查询中使用的时区而言,可以设置几个选项,您可以将其设置为默认的:utc或将其设置为:local。您已配置utc,这是默认设置。 :local将时区设置为服务器的时区。此设置在config/application.rb

中设置
config.active_record.default_timezone = :utc

第二部分 - rails应用程序的时区也可以在config/application.rb中设置:

config.time_zone = 'Brasilia'

使用此设置,当您使用时区感知类时,例如Time.zone.now要在您的应用程序中检索时间,他们将使用此配置的时区。设置config.time_zone时要注意的一点是在应用程序中使用时区感知类,以确保时区的一致转换,无论环境如何。