Mysql 使用activerecord时,Time.now的值不同

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

我有一个奇怪的情况:

当我在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')
有什么想法吗

  • 轨道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效果很好,是我当前场景中的最佳解决方案。