Ruby on rails Rails 4中sql未正确使用日期 请考虑以下Rails控制台的执行和输出 root@localhost:/home/gokula/web# rails c production Loading production environment (Rails 4.1.4) 2.1.1 :001 > Customer.sign_up_between( Date.parse("13/11/2014").in_time_zone, Date.parse("24/11/2014").in_time_zone).to_sql => "SELECT \"customers\".* FROM \"customers\" WHERE (sign_up BETWEEN '2014-11-12 11:00:00.000000' AND '2014-11-23 11:00:00.000000')" 2.1.1 :002 > Date.parse("13/11/2014").in_time_zone => Thu, 13 Nov 2014 00:00:00 NZDT +13:00 2.1.1 :003 >

Ruby on rails Rails 4中sql未正确使用日期 请考虑以下Rails控制台的执行和输出 root@localhost:/home/gokula/web# rails c production Loading production environment (Rails 4.1.4) 2.1.1 :001 > Customer.sign_up_between( Date.parse("13/11/2014").in_time_zone, Date.parse("24/11/2014").in_time_zone).to_sql => "SELECT \"customers\".* FROM \"customers\" WHERE (sign_up BETWEEN '2014-11-12 11:00:00.000000' AND '2014-11-23 11:00:00.000000')" 2.1.1 :002 > Date.parse("13/11/2014").in_time_zone => Thu, 13 Nov 2014 00:00:00 NZDT +13:00 2.1.1 :003 >,ruby-on-rails,timezone,rails-activerecord,Ruby On Rails,Timezone,Rails Activerecord,当我执行TOU sql时,它会显示2014年11月12日的查询,但当我直接执行日期转换代码时,它会正常工作 不确定这是否是一个bug。请建议如何更正此问题。ActiveRecord会自动将每个日期实例转换为UTC,因为它总是将日期对象存储在数据库的UTC时区中,以避免时区不一致 如果要更改所有对象的默认时区,则可以使用配置config.active\u record.default\u timezone。此设置确定从数据库中提取日期和时间时是使用Time.local(如果设置为:local)还是

当我执行TOU sql时,它会显示2014年11月12日的查询,但当我直接执行日期转换代码时,它会正常工作


不确定这是否是一个bug。请建议如何更正此问题。

ActiveRecord会自动将每个日期实例转换为UTC,因为它总是将日期对象存储在数据库的UTC时区中,以避免时区不一致

如果要更改所有对象的默认时区,则可以使用配置
config.active\u record.default\u timezone
。此设置确定从数据库中提取日期和时间时是使用Time.local(如果设置为:local)还是使用Time.utc(如果设置为:utc)。默认值为:utc

请注意,此配置是应用程序中整个ActiveRecord使用的全局配置。老实说,我不会改变它

相反,您可以传递时区感知对象而不是日期,ActiveRecord将调整该值。日期没有时区,但时间对象有时区

使用

而不是

Date.parse("13/11/2014")
ActiveRecord将适当地将日期转换为UTC时区,您将能够获取正确的记录

2.1.5 :011 > Date.parse("13/11/2014")
 => Thu, 13 Nov 2014 
2.1.5 :012 > DateTime.parse("2014-11-13 00:00:00 NZDT")
 => Thu, 13 Nov 2014 00:00:00 +1300 
2.1.5 :011 > Date.parse("13/11/2014")
 => Thu, 13 Nov 2014 
2.1.5 :012 > DateTime.parse("2014-11-13 00:00:00 NZDT")
 => Thu, 13 Nov 2014 00:00:00 +1300