2012-04-26 104 views
2

我有一個模型,它具有緯度,經度和日期時間屬性,我希望能夠計算該位置的時區併爲模型的每個單獨實例進行設置。這裏是我寫的代碼,以獲得時區有我缺少的東西?根據位置計算時區[Rails]

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 

有什麼,我失蹤,爲什麼這不是設置正確的時間?

回答

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。

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