Mysql 使用activerecord时,Time.now的值不同
我有一个奇怪的情况: 当我在rails控制台Mysql 使用activerecord时,Time.now的值不同,mysql,ruby-on-rails,activerecord,Mysql,Ruby On Rails,Activerecord,我有一个奇怪的情况: 当我在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
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')
有什么想法吗
- 轨道4
- Mysql 5.5
- 这些时间是相同的。一个是UTC偏移量-3,另一个是UTC时间,没有偏移量。您在sql查询中看到的时间是UTC时间。之所以在rails控制台中使用
Time.now
和Time.zone.now
返回相同的时间,是因为您的系统和rails应用程序都位于同一时区。根据系统时区返回系统时间的是Time.now
,返回应用程序的时区感知时间的是Time.zone.now
就查询中使用的时区而言,可以设置两个选项,您可以将其设置为默认值:utc
,也可以将其设置为:local
。您已配置utc
,这是默认设置<代码>:本地将时区设置为服务器的时区。此设置在config/application.rb
中设置:
config.active_record.default_timezone = :utc
config.time_zone = 'Brasilia'
第二部分-rails应用程序的时区也可以在config/application.rb
中设置:
config.active_record.default_timezone = :utc
config.time_zone = 'Brasilia'
通过此设置,当您使用时区感知类(例如
time.zone.now
在应用程序中检索时间时,它们将使用此配置的时区。设置config.time\u zone
还需要注意的一点是在应用程序中使用时区感知类,以确保时区的一致转换,而不管环境如何。数据库、本地时间或UTC中的值是如何存储的?那么生成的sql是正确的。ActiveRecord将在数据库上执行语句之前从本地时间转换为UTC,以便与数据的存储方式保持一致。感谢您的解释。在config/application.rb中将default_timezone设置为:local效果很好,是我当前场景中的最佳解决方案。