在 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 > 

当我这样做时to_sql它显示 12/11/2014 日期的查询,但当我直接执行日期转换代码时,它就可以正常工作。

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

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

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

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

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

DateTime.parse("2014-11-13 00:00:00 NZDT")

而不是

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 

相关内容

  • 没有找到相关文章

最新更新