我已经一遍又一遍地阅读(否则)优秀的Mysql2 gem的文档。
我有一个生产Rails应用程序托管在服务器上运行在UTC。应用程序的配置。time_zone设置为"东部时间(US &加拿大)。"
我们有一个内部的MS access -head应用程序(谢天谢地,它使用了MySQL数据库),上面提到的Rails应用程序连接到它来同步产品数据、生产计划等。由于应用程序的限制,这个MySQL服务器不能移动到云中,而且——不用说——我们不能将其时区处理更改为UTC——一切都在EST中。
当我从Rails应用程序连接到本地数据库检索数据时,Mysql2(默认情况下)将所有本地数据转换为可消化的Ruby对象。然而,我可以让Rails应用程序正确解释日期的唯一方法是在Mysql2查询命令期间发送:cast => false,然后在响应处理中运行Time.zone。对结果进行解析(字符串)。这就需要使用本地Ruby对象强制转换,其效率远远低于gem内置的强制转换函数。
我尝试传递文档中提到的database_timezone和application_timezone选项,但是:local符号没有使用应用程序配置的预期效果。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
晚了几年。
我阅读了关于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,
)