gpt4 book ai didi

ruby-on-rails - Rails 和 Postgres 查询以 UTC 存储的记录时出现问题;应用程序时区为 UTC,但未找到记录

转载 作者:行者123 更新时间:2023-11-29 14:02:40 25 4
gpt4 key购买 nike

我有一个带有默认时区设置 (UTC) 的 Rails 5 应用程序。我有一条记录是在 2019 年 8 月 8 日星期四 02:12:56 UTC +00:00 创建的,但位于中部时间的某人正在访问该应用程序,这意味着该记录是为他们创建的2019 年 8 月 7 日星期三 20:12:56 CST -06:00;该应用程序提供了一个过滤器,该用户正在尝试从 08/07/2019 检索记录,并期望该记录将成为结果集的一部分,日期过滤器作为 Date 对象传递。

我已经尝试了几种形式来将此 Date 对象转换为一种形式,当传递给查询时,它会成功返回预期的结果。注意:filter.end_date 是 Date 的一个实例,值为 "Wed, 07 Aug 2019"

查询:

Record.where("records.created_at BETWEEN ? AND ?", filter.start_date.beginning_of_day, filter.end_date.end_of_day)

SQL:

Record Load (4.2ms)  SELECT "records".* FROM "records" WHERE (records.created_at BETWEEN '2019-08-07 00:00:00' AND '2019-08-07 23:59:59.999999')

我实现此目的的唯一方法是将时区设置为中央时间,然后传递查询:

这是有效的

Time.use_zone("Central America") { Record.where("records.created_at BETWEEN ? AND ?", date_filter.end_date.beginning_of_day, date_filter.end_date.end_of_day) }

SQL:

Record Load (4.2ms)  SELECT "records".* FROM "records" WHERE (records.created_at BETWEEN '2019-08-07 06:00:00' AND '2019-08-08 05:59:59.999999')

我想知道是否有一种方法可以避免在应用程序中为每个用户设置时区,并在传递过滤器中提供的日期时进行正确的转换。

最佳答案

不幸的是,没有一种简单的方法可以忽略时区。

如果您在注册时获得用户时区,您可以将类似 Time.zone(current_user.timezone) if current_user 添加到操作前回调或其他一些初始启动序列中。其缺点是使值大部分是静态的,即如果他们正在旅行并且处于不同的时区,您的结果将仍然适用于您的“家乡”时区,除非您将其作为选项添加到他们的个人资料等中。

或者,您可以使用 javascript 动态设置当前时区:

window.addEventListener("submit", function(event) { // listen to all submit events
var form = event.target.closest('form');
var timezoneInput = form.querySelector('input[name=timezone]');

if (timezoneInput) {
timezoneInput.value = moment.tz.guess(); // assuming you are using a time library
}
});

并在你的 Controller 中处理它:


def index
Time.use_zone(params[:timezone]) do
@records = Record.where("records.created_at BETWEEN ? AND ?", date_filter.end_date.beginning_of_day, date_filter.end_date.end_of_day)
end
end

关于ruby-on-rails - Rails 和 Postgres 查询以 UTC 存储的记录时出现问题;应用程序时区为 UTC,但未找到记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57469149/

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