如何使用地理编码宝石获取时区?

时间:2015-07-07 11:55:09

标签: ruby-on-rails ruby timezone geocode

我必须在我的Rails应用程序中添加time_zone_select。我正在考虑一些宝石根据用户请求设置默认值,但我已经看到该项目已经为此安装了geocode gem。

有没有办法通过这个宝石获得时区?

3 个答案:

答案 0 :(得分:7)

您无法直接从地理编码器gem获取时区。 它可以给你位置。

您可以使用下面的宝石来获取特定区域或(纬度,长度)值的时区。

https://github.com/panthomakos/timezone

timezone = Timezone::Zone.new :latlon => [-34.92771808058, 138.477041423321]
timezone.zone
=> "Australia/Adelaide"
timezone.time Time.now
=> 2011-02-12 12:02:13 UTC

答案 1 :(得分:1)

这似乎对我有用(对于我测试过的大部分时区)。

我放在这里的所有代码都是控制器中的方法(在我的例子中,在ApplicationController中)。

def request_location
  if Rails.env.test? || Rails.env.development?
    Geocoder.search("your.public.ip.here").first
  else
    request.location
  end
end

def get_time_zone
  time_zone = request_location.data["time_zone"]
  return ActiveSupport::TimeZone::MAPPING.key(time_zone) || "UTC"
end

当然,您应该将your.public.ip.here替换为您的实际公共IP或类似内容。我在这里放置了一个IP,以便Geocoder提供的响应与请求中的响应格式相同。

我很高兴听到有关代码的评论。

答案 2 :(得分:0)

我已经看到了另一种方法,但 Nitin Satish 的建议仍然更好。无论如何,有多个选项是好的:

 loc = request.location.data
 tzc = TZInfo::Country.get(loc["country_code"])
 timezone = Timezone::Zone.new zone:tzc.zone_names.first
 timezone.local_to_utc(Time.now)