我对轨道中的区域有问题。
我有CarRoute id: 22783, route_time: "2016-07-07 05:30:00"
但在CarRoute.find_by_id(22783).route_time is Thu, 07 Jul 2016 07:30:00 CEST +02:00
所以轨道增加了 2 小时,但当我想按时间找到这条路线时,这条路线不起作用,
CarRoute.where(:id=>22783,:route_time=> DateTime.new(Date.today.year, Date.today.month, Date.today.day, 7, 0, 0, 0)..DateTime.new(Date.today.year, Date.today.month, Date.today.day, 19, 0, 0, 0))
=> []
恩永知道怎么找到这个吗?
Rails 以 UTC 格式存储所有内容,这意味着您在分配日期时间时使用什么时区,它都会转换为 UTC。当活动记录加载新记录时,该日期以当前时区 (Time.zone) 显示,这就是为什么当您执行 CarRoute.find_by_id(22783).route_time
时,您将获得 CEST 日期,但如果您转到数据库,您将看到 UTC 日期。
以下应该让您清楚:
> Time.zone
=> #<ActiveSupport::TimeZone:0x007ff6bd390100 @name="UTC", @utc_offset=nil, @tzinfo=#<TZInfo::DataTimezone: Etc/UTC>>
> a = Account.first
=> #<Account id: 6 .....
> a.updated_at
=> Wed, 06 Jul 2016 18:47:32 UTC +00:00
> Time.zone = "EST"
=> "EST"
> a.reload
...
> a.updated_at
=> Wed, 06 Jul 2016 13:47:32 EST -05:00
当您使用 DateTime.new
时,日期是在 utc 中创建的:
> d = DateTime.new(2016,7,7)
=> Thu, 07 Jul 2016 00:00:00 +0000
> d.utc?
=> true
> a.updated_at.utc?
=> false
在 where 查询中,你从 7 UTC 开始,即欧洲中部夏令时上午 9 点。尝试类似操作:
DateTime.new(2016,7,7,7,0,0,0).change(offset: 'CEST')