请考虑从 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