Mysql2 gem 在本地(服务器)时间从远程数据库投射日期时间对象

Tho*_*hom 5 timezone datetime ruby-on-rails mysql2

我一遍又一遍地阅读(否则)优秀的 Mysql2 gem 的文档。

我在以 UTC 运行的服务器上托管了一个生产 Rails 应用程序。应用程序的 config.time_zone 设置为“东部时间(美国和加拿大)”。

我们有一个内部 MS Access 为头的应用程序(幸运的是,它使用了 MySQL 数据库),上述 Rails 应用程序连接到该应用程序以同步产品数据、生产计划等。由于应用程序的限制,该 MySQL 服务器无法移入云中,而且——不用说——我们不能将其时区处理更改为 UTC——一切都在 EST 中。

当我从 Rails 应用程序连接到本地数据库以检索数据时,Mysql2(默认情况下)将所有本机数据转换为可消化的 Ruby 对象。但是,我可以让 Rails 应用程序正确解释日期的唯一方法是在 Mysql2 查询命令期间发送 :cast => false,然后在响应处理中对结果运行 Time.zone.parse( string ) . 这需要原生 Ruby 对象转换,这远不如 gem 内置的转换函数那么高效。

我尝试传递文档中提到的 database_timezone 和 application_timezone 选项,但 :local 符号没有使用应用程序的 config.time_zone 属性的预期效果。

thehost.query("SELECT NOW() AS n;", :symbolize_keys => true).each { |result| p result[:n] }

2015-05-19 16:28:41 +0000

thehost.query("SELECT NOW() AS n;", :symbolize_keys => true, :database_timezone => :local, :application_timezone => :local).each { |result| p result[:n] }

2015-05-19 16:30:11 +0000

thehost.query("SELECT NOW() AS n;", :symbolize_keys => true, :database_timezone => :utc, :application_timezone => :local).each { |result| p result[:n] }

2015-05-19 16:30:28 +0000

thehost.query("SELECT NOW() AS n;", :symbolize_keys => true, :database_timezone => :local, :application_timezone => :utc).each { |result| p result[:n] }

2015-05-19 16:30:57 UTC

thehost.query("SELECT NOW() AS n;", :symbolize_keys => true, :database_timezone => :utc, :application_timezone => :utc).each { |result| p result[:n] }

2015-05-19 16:31:19 UTC
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 0

晚了几年。

我阅读了 Mysql2 Gem 上的文档

    uri = URI.parse(ENV['DATABASE_URL'])
    mysql = Mysql2::Client.new(
      host: uri.host,
      username: uri.user,
      password: uri.password,
      port: uri.port,
      database: uri.path[1..-1],
      encoding: 'utf8',
      database_timezone: :utc,   
      application_timezone: :utc,
    )
Run Code Online (Sandbox Code Playgroud)