1

私のサーバーにはシステムタイムゾーン「ヨーロッパ/パリ」があります

Railsアプリ(Rails 3.29)を構成しましたconfig.time_zone='ヨーロッパ/ロンドン'config.active_record.default_timezone=:utc

すべてのイベントの開始/終了日は、次のようにデータベースに保存されます: "2013-01-02 10:00:00"

問題はスコーピングにあります

scope :starting, lambda {|start_date_time|
  {:conditions => ["starts_at = ?", Event.db_datetime(start_date_time)] }
}
...
def self.db_datetime(date_time)
  Time.at(date_time.to_i).utc.to_s(:db)
end

start_date_timeフィルターを作成すると、システムのローカルタイムゾーン日時が取得されますstart_date_time = Time.new(2013、1、2、10、0、0)2013-01-02 10:00:00 +0100

and Event.db_datetime(start_date_time) gives "2013-01-02 09:00:00" 
which cannot be found 

utc datetimeを強制する方法はありますか:start_date_time = Time.new(2013、1、2、10、0、0)は2013-01-0210:00:00UTCを与えます

フィードバックをありがとう

4

1 に答える 1

3

Time.at-またはTime.new-は、システムのローカルタイムゾーンの時刻を解析します。ここでは、UTC+1のように見えます。そのため、UTC+1で10:00を解析するとUTCで09:00になります。

お探しの機能は

Time.zone.at                             #equivalent to Time.at
Time.zone.local(2013, 1, 2, 10, 0, 0)    #equivalent to Time.new

これは、によって定義されたタイムゾーンで指定された日時を解析します

config.time_zone = 'Europe/London' 

この結果がTimeWithZoneオブジェクトであり、これはRubyTimeのRails拡張です。

TimeWithZoneの詳細については、このドキュメントページhttp://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.htmlを確認してください。

このように使用できます。db_datetime(date_time)メソッドはもう実際には必要ありません:

# class Event
scope :starting, lambda {|start_date_time|
  {:conditions => ["starts_at = ?", start_date_time.to_s(:db)] }
}
# I think to_s(:db) already handle the .utc conversion part



## example
start_date_time = Time.zone.local(2013, 1, 2, 10, 0, 0) 
Event.starting(start_date_time)
于 2012-12-05T13:55:00.743 に答える