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
ました - しかし、これは夏時間のために問題を引き起こし、また良い解決策とは思えません.
これは唯一の問題ではありません。2 つ目の問題は、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