0

我在我的 Rails 应用程序中添加了一个日历。我们的活动有开始日期和结束日期(都包括小时和分钟)。这些是事件表中的字段,实际上它们的格式是日期时间。当您为特定事件选择开始日期、结束日期、标题和描述(以及其他)时,参数散列如下所示:

parameters = {"event" => {"title" => "a title", "description" => "a description", "start_date" => "2012-09-23 23:45", "end_date" => "2012-09-24 15:32"}}

在事件控制器中,我有这样的事情:

Event.create(:title => params[:event][:title],
             :description => params[:event][:description],
             :start_date => params[:event][:start_date].present? ? DateTime.strptime(params[:event][:start_date], "%Y-%m-%d %H:%M") : nil,
             :end_date => params[:event][:end_date].present? ? DateTime.strptime(params[:event][:end_date], "%Y-%m-%d %H:%M") : nil,
             ...
            )

那么,当这个事件被存储到数据库(mysql)中时,开始日期的值为“2012-09-23 20:45”,而结束日期的值为“2012-09-24 12:32”。我知道 Rails 会自动处理时区。我的问题是,当我想获取特定时间的所有事件(例如,今天发生的所有事件)时,我会:

query = "((start_date between ? AND ?) OR (end_date between ? AND ?))"
query << "title NOT LIKE ? AND ..."
self.events.where(query, 
                  Time.now.beginning_of_day, Time.now.end_of_day, 
                  Time.now.beginning_of_day, Time.now.end_of_day, 
                  some_restriction_here, ...)

我得到了错误的事件!(很明显,为什么数据库中的日期和时间与输入不同)。也有一个明显的解决方案,将所有事件带入内存,日期和时间将再次与原来的一样,但这在资源方面是昂贵的。另一方面,这并不能解决时区问题,如果有人在中国创建一个事件,则数据库中的值将相对于服务器本地化的时间偏移量。我可以在某处有一个字段,用户可以在其中设置时区并使用此字段为此类用户存储特定日期并完成此操作,您对处理此问题的最佳方法有什么建议?

4

1 回答 1

0

Rails 以 UTC 格式将所有日期存储在数据库中。因此,一种方法是始终以 UTC 进行操作,并在视图中将显示的日期转换为当前时区。另一种方法是在每个操作开始时更改 Rails 时区。所有解析的时间和日期都将在您的自定义时区中。

def action_name
  Time.zone = "Prague"
  # ... logic
end
于 2012-09-23T12:40:29.473 回答