2012-06-13 47 views
0

我知道Ruby on Rails以UTC(对于created_at和updated_at字段)存储所有时间,并且当您从数据库中获取活动记录对象并询问RoR的日期时,它会将它转换成您的配置(在environment.rb)时区并显示给您。根据created_at过滤器从数据库查询活动记录对象

但我的情况是不同的。我正在构建一个自定义查询。我正在手动添加一个where子句。 Where子句是这样的:select * where created_at > [user entered date].

现在出现的问题是用户输入的日期是UTC -7,而created_at是UTC。所以我不能真正让它工作。我可以像select * where created_at > [user-entered-date] 07:00:00那样对其进行硬编码 - 但由于夏时制,这造成了问题,而且似乎也不是一个好的解决方案。

这不是唯一的问题,第二个问题是,当我打印出record.created_at,我得到UTC日期(也许是因为我建立一个自定义查询?),这也是我不想手动(硬编码)转换为当地时间。

这里是我的查询代码:

cond = EZ::Where::Condition.new 

if !start_date.empty? 
    start_date = params[:filter][:start_date].to_date.to_s(:db) 
    cond.append "(registrations.created_at) >= '#{start_date} 07:00:00'" #Here! 
end 

if !end_date.empty? 
    end_date = params[:filter][:end_date].to_date 
    end_date = end_date + 1.day; 
    end_date = end_date.to_s(:db) 
    cond.append "(registrations.created_at) <= '#{end_date} 07:00:00'" #Here! 
end 

registrations = Registration.all(
:joins => [:event], 
:select => 'registrations.id, registrations.first_name, registrations.last_name, registrations.company_name, 
(registrations.created_at) AS reg_date, events.name AS evt_name, sum(fees) AS fees, code, events.id AS event_id', 
:group => 'registrations.id', 
:order => 'evt_name, events.id', 
:conditions=> cond.to_sql 
) 
unless registrations.empty? 

    registrations.each_with_index do |registration, i| 
    sheet[ i, 3 ] = (DateTime.strptime(registration.reg_date, "%Y-%m-%d %H:%M:%S") - 7.hours).to_date #Here! 
    end 
end 
+0

我肯定有做这样的东西的规范方式,这是我完全没拿到在教育自己的同时看待,所以现在我陷入了这个问题。 –

回答

0

尝试使用TimeWithZoneTimeZone

tz = ActiveSupport::TimeZone.new("Mountain Time (US & Canada)") 
... 
start_date = tz.local_to_utc(params[:filter][:start_date].to_time).to_s(:db) 
... 
sheet[ i, 3 ] = registration.reg_date.in_time_zone("Mountain Time (US & Canada)").to_date