【问题标题】:Rails in time zone finding - not working时区查找中的 Rails - 不起作用
【发布时间】:2016-07-07 07:08:25
【问题描述】:

我对 Rails 中的区域有疑问。

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

有人知道怎么找到这个吗?

【问题讨论】:

  • 好的,所以 rails 不会“添加” 2 小时 - 您的数据通常以 UTC 格式存储在数据库中,这是因为这是一个很好的标准。然后您可能会在您当地的时区显示它(在那里您会得到 2 小时的时差)。所以...要找到它,您需要使用 UTC 时间
  • 但 DateTime.new(Date.today.year, Date.today.month, 5, 7, 0, 0, 0) 在 UTC 返回 2016 年 7 月 5 日星期二 07:00:00 UTC +00:00 我尝试 Time.zone.local(Date.today.year, Date.today.month, 5, 7, 0, 0).in_time_zone('UTC') 但它看起来对我来说很奇怪 ;)

标签: mysql ruby-on-rails datetime


【解决方案1】:

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 查询中,您从 UTC 时间 7 点开始,即 CEST 上午 9 点。尝试类似:

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

【讨论】:

    猜你喜欢
    • 2020-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 2016-01-10
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多