【发布时间】:2012-09-23 07:53:33
【问题描述】:
我在我的 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, ...)
我得到了错误的事件! (很明显,为什么数据库中的日期和时间与输入不同)。还有一个明显的解决方案,将所有事件都带入内存,日期和时间将再次与原来的一样,但这在资源方面是昂贵的。另一方面,这并不能解决时区问题,如果有人在中国创建一个事件,数据库中的值将与服务器本地化的时间偏移量有关。我可以在某处有一个字段,用户可以在其中设置时区并使用此字段为此类用户存储特定日期并解决此问题,您对处理此问题的最佳方法有何建议?
【问题讨论】: