在时区找到Rails - 不工作

时间:2016-07-07 07:08:26

标签: mysql ruby-on-rails datetime

我对导轨中的区域有问题。

我有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

所以rails添加了2h,但是当我想要按时间查找这条路线时,

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)) 
 => []

Enyone知道怎么找到这个?

1 个答案:

答案 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 

在您的查询位置,您将在7 UTC(即CEST上午9点)开始。尝试类似:

DateTime.new(2016,7,7,7,0,0,0).change(offset: 'CEST')