红宝石时区转换问题



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

我想知道哪一个实际上是我用例中要使用的正确陈述,我会在此处进行一些输入。

我都不使用任何一个。

这个:

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 ...这可能会留下一些小窗口,以免出现错误。>

我可能会这样做:

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

相关内容

  • 没有找到相关文章

最新更新