我有一个具有纬度,经度和日期时间属性的模型,我希望能够计算该位置的时区并为模型的每个单独实例设置它。这是我写的代码,以获得时区是否有我缺少的东西?
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 :(得分:1)
我不确定您是否真的想在模型的每个实例中设置时区。根据MVC,从Controller访问模型,在控制器级别设置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中的helper方法
around_filter :set_time_zone
答案 1 :(得分: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。