【问题标题】:Querying active record objects from database based on created_at filters根据 created_at 过滤器从数据库中查询活动记录对象
【发布时间】:2012-06-13 12:18:03
【问题描述】:

我知道 Ruby on rails 始终以 UTC 存储时间(对于 created_at 和 updated_at 字段),当您从数据库中获取活动记录对象并询问 RoR 它的日期时,它会将其转换为您配置的(在 environment. rb)时区并告诉你。

但我的情况不同。我正在构建一个自定义查询。我正在手动添加一个 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

【问题讨论】:

  • 我确信有一种规范的方式来做这些事情,我在教育自己的时候完全没有看到,所以现在我被这个东西困住了。

标签: ruby-on-rails activerecord timezone


【解决方案1】:

尝试使用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

【讨论】:

    猜你喜欢
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    相关资源
    最近更新 更多