我有这种奇怪的情况:
当我在rails控制台Time.now
或Time.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')
对此的任何想法?
答案 0 :(得分:2)
那些是同一时期。一个的UTC偏移量为-3,另一个的是UTC时间,没有偏移量。
答案 1 :(得分:1)
您在sql查询中看到的时间是 UTC 时间。您在rails控制台中同时返回Time.now
和Time.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
时要注意的一点是在应用程序中使用时区感知类,以确保时区的一致转换,无论环境如何。