= ? and DATE(created_at) 14) 此处发布的许多-6ren">
gpt4 book ai didi

ruby-on-rails - 如何用 Ruby 定义 一天前在 2 :00 PM?

转载 作者:太空宇宙 更新时间:2023-11-03 17:01:06 24 4
gpt4 key购买 nike

我需要搜索从昨天下午 2:00 到现在的事件,我正在尝试这样

events.where("DATE(created_at) >= ? and DATE(created_at) <=", (1.day.ago + 14.hours).strftime('%Y-%m-%d %H:%M:'), Time.now.strftime('%Y-%m-%d %H:%M:') )

但它显示为空...但是当我从格式化文本中删除“%H:%M:”时,我也得到了它们。

最佳答案

首先,您需要了解我要翻译成的“昨天下午 2:00 是什么”:

DateTime.now.yesterday.beginning_of_day.change(:hour => 14)

此处发布的许多解决方案建议在昨天开始时增加 14 小时,但这是错误的。 记住夏令时!更安全的做法是将小时更改为适当的值。

一天不是24小时。根据星期几,有 23、24 和 25。为了证明这一点,请查看 DST 过渡期:

Time.zone = 'EST5EDT'
DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day + 14.hours
# => Sun, 11 Mar 2012 15:00:00 EDT -04:00

那是下午 3 点,因为凌晨 1 点到凌晨 2 点没有发生。使用 change 你应该总是得到正确的结果:

DateTime.parse('2012-03-12 12:34:56 -0500').to_time_in_current_zone.yesterday.beginning_of_day.change(:hour => 14)
# => Sun, 11 Mar 2012 14:00:00 EDT -04:00

通常您也可以使用 BETWEEN 运算符来简化您的日期计算,但在您的情况下,因为您是在那个时间点和现在之间获取数据,假设您没有事件将来你可以省略一个绑定(bind)。此外,ActiveRecord 应该在进行查询时正确处理格式化 DateTime 值,因此 strftime 调用通常会适得其反,因为您很容易弄错。

events.where("DATE(created_at) >= ?", DateTime.now.yesterday.beginning_of_day.change(:hour => 14))

如果您出于任何原因不得不处理 future 的事件:

events.where("DATE(created_at) BETWEEN ? AND ?", DateTime.now.yesterday.beginning_of_day.change(:hour => 14), DateTime.now)

请记住,以 UTC 格式存储数据库时间并在进行查询时从本地时间转换为 UTC 通常是有利的。如果您需要同时处理多个时区,那么在数据库中存储时区污染值可能会造成各种麻烦。

关于ruby-on-rails - 如何用 Ruby 定义 一天前在 2 :00 PM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9592829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com