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,从 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 中的辅助方法

 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 回答