【问题标题】:ruby timezone conversion issues红宝石时区转换问题
【发布时间】:2014-01-22 20:01:49
【问题描述】:

我有一个场景,我得到一个时间戳,我需要在该时间戳中搜索该日期的所有预订。时间戳在用户各自的时区中,数据库中的所有记录都存储在 UTC 中。所以很自然我需要将该时间戳转换回UTC然后搜索。

这是我正在做的事情:

Booking.where("date_time >= '#{DateTime.parse(timestamp).in_time_zone('UTC').beginning_of_day}' and date_time <= '#{DateTime.parse(timestamp).in_time_zone('UTC').end_of_day}'")

这基本上意味着获取从一天开始到结束的所有预订

但是,当我使用以下查询时,它会给我一个不同的结果:

Booking.where("date_time >= '#{DateTime.parse(timestamp).beginning_of_day.in_time_zone('UTC')}' and date_time <= '#{DateTime.parse(timestamp).end_of_day.in_time_zone('UTC')}'")

我想知道在我的用例中使用哪一个实际上是正确的语句,我希望能在这里提供一些输入。

【问题讨论】:

    标签: ruby-on-rails ruby timezone rails-activerecord activesupport


    【解决方案1】:

    我不会使用任何一个。

    这个:

    DateTime.parse(timestamp).in_time_zone('UTC').beginning_of_day
    

    为您提供 UTC 日的开始,而不是本地时区日与 UTC 的偏移量的开始。简而言之,它是不正确的,不会为您提供所需的内容。

    这个:

    DateTime.parse(timestamp).beginning_of_day.in_time_zone('UTC')
    

    正确,因为它将时间更改为当地时区的一天开始,然后将时间戳转换为 UTC。

    如果您让 ActiveRecord 使用占位符处理报价,那么它将应用 UTC 调整本身。

    我也会使用&lt; t.tomorrow.beginning_of_day 而不是&lt;= t.end_of_day 来避免时间戳截断和精度问题;一天的结束被认为是在 23:59:59.999... 这可能会留下一个很小的窗口让错误蔓延。我在这里很迂腐,你可能不在乎这个。

    我可能会这样做:

    t = DateTime.parse(timestamp)
    Booking.where('date_time >= :start and date_time < :end',
      :start => t.beginning_of_day,
      :end   => t.tomorrow.beginning_of_day
    )
    

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 2016-03-23
      • 1970-01-01
      • 2014-02-10
      • 2011-01-09
      • 1970-01-01
      • 2016-05-16
      • 2015-07-17
      相关资源
      最近更新 更多