ruby时区转换问题

时间:2014-01-22 20:01:49

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

我有一个方案,我得到一个时间戳,我需要在该时间戳中搜索该日期的所有预订。时间戳位于用户各自的时区中,数据库中的所有记录都以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')}'")

我想知道哪一个实际上是在我的用例中使用的正确语句,我将在这里感谢一些输入。

1 个答案:

答案 0 :(得分: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调整。

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

我可能更喜欢这样做:

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