2

緯度、経度、日時の属性を持つモデルがあり、その場所のタイムゾーンを計算して、モデルの個々のインスタンスごとに設定できるようにしたいと考えています。タイムゾーンを取得するために作成したコードは次のとおりです。不足しているものはありますか?

require 'nokogiri'
require 'open-uri'

before_validation :set_current_time_zone

def set_current_time_zone
  Time.zone = find_timezone_based_on_location
end

def find_time_zone_based_on_location
  url = "http://www.earthtools.org/timezone-1.1/#{self.latitude}/#{self.longitude}"
  doc = Nokogiri::XML(open(url))
  offset = doc.at_xpath('//offset').text().to_i
  if offset == -5
    "Eastern Time (US & Canada)"
  ....
  elsif offset == -8 
    "Pacific Time (US & Canada)"
  end
end

なぜこれが正しい時刻を設定していないのかについて私が見逃しているものはありますか?

4

2 に答える 2

1

モデルの各インスタンスで本当にタイム ゾーンを設定する必要があるかどうかはわかりません。モデルがコントローラーからアクセスされるため、MVC に従って、コントローラー レベルで time_zone を設定するだけで十分です。タイムゾーンがコントローラーレベルで設定されると、時間に関連するすべての計算は、フィルターに設定された time_zone でそのリクエストに対して処理されます。以下はコードです。

 def set_time_zone
   old_time_zone = Time.zone
   Time.zone = find_time_zone_based_on_location
   yield
  ensure
    Time.zone = old_time_zone
  end

そして、タイムゾーンを設定したいコントローラーで、周りのフィルターを定義します。find_time_zone_based_on_location (上記で定義したとおり) は、application_controller のヘルパー メソッドにすることができます

 around_filter :set_time_zone
于 2012-04-26T23:06:35.977 に答える
0

set_current_time_zoneを次のように変更することで、コードを機能させることができました。

def set_current_time_zone
  self.attributeActiveSupport::TimeZone[find_time_zone_based_on_location].local_to_utc(self.attribute)
end

これにより、正しいタイムゾーンが検出され、その時刻がUTCに変換されます。

于 2012-04-29T22:11:18.877 に答える