19

我使用以下方法将 Heroku 网站的时区设置为太平洋标准时间 (PST):

heroku config:add TZ=America/Los_Angeles

用户的时间现在总是在 PST 中——无论他们是否在 PST 时区。

获取用户实际时区(即他们实际所在的时区)的最佳方法是什么?

我猜这可以使用 Rails(或 Javascript?)来解决,而不是 Heroku。

4

3 回答 3

22

有两种方法可以做到这一点。

  • 事实上,您可以使用 javascript 来获取他们当前的时间/时区。有可能是用户的计算机时间设置不正确,在这种情况下您显示的时区将不正确。

    因为您使用的是 Rails,所以推荐的方法是将 javascript 捆绑为 gem,例如detect_timezone_rails. 这使它易于安装(因为它全部自动捆绑在资产管道中。

  • 您可以使用 IP 地址来推断他们的国家和时区。这种情况下的危险是用户可能正在使用代理。此外,虽然 IP 地址通常具有城市级别的分辨率,但它可能或多或少准确,在极少数情况下可能会给出错误的时区。

    使用 IP 地址,您可以获得他们的大致城市和纬度/经度。在Ruby Toolbox上有很多 gem 可以做到这一点,例如。geocoder. 使用纬度/经度,您可以使用像timezone.

您还可以使用上述方法之一,并允许用户在您的网站上手动更改他们的时区(如果已注册,则将此设置存储在数据库中,或者作为浏览器上的 cookie)。这在您弄错时区时很有用。

于 2012-09-07T23:37:56.213 回答
14

根据您的应用程序设置方式,您可以通过多种方式执行此操作。这些都不是 Heroku 环境独有的。

如果您的应用程序允许用户注册,那么您很可能有一个用户模型,并且您可能正在使用 Devise gem 进行身份验证/注册。将一个字段添加到您的数据库(:time_zone),并在用户注册时将用户时区存储在此字段中。

>> rails generate migration add_time_zone_to_users time_zone:string
>> rake db:migrate

Rails 为您提供了一个方便的 time_zone_select 表单助手,它为您提供了一个选择列表,其中包含您可以向用户显示的所有时区。将其添加到用户注册表单中,并允许用户在注册时设置他们的时区。 http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/time_zone_select

在您的应用程序控制器中,您可以执行以下操作;

before_filter :set_time_zone

def set_time_zone
    #current user is a devise method see https://github.com/plataformatec/devise
    Time.zone = current_user.time_zone if current_user
end

然后,当您在时间实例上的应用调用中显示日期时.in_time_zone,该时间实例将显示用户时区的时间。

<%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 

如果您没有用户身份验证,那么您可以回退到 javascript。为此,您可以getTimezoneOffset()在日期对象上使用本机 javascript,或者更好地使用以下 jsTimezoneDetect 插件:

http://www.pageloom.com/automatic-timezone-detection-with-javascript

最后,您可以使用两者的混合,首先使用 javascript 检测它们的时区偏移,然后将此值存储在 rails session/cookie 中,然后使用 before_filter 设置 Time.zone 如上所述,但基于之前计算的会话 time_zone 值在 JavaScript 中。

于 2012-09-07T23:58:06.720 回答
5

或者你可以使用这个很棒的 gem https://github.com/kbaum/browser-timezone-rails

于 2014-05-25T07:40:48.180 回答