Javascript Rails:如何获取当前用户&x27;使用Heroku时的时区

Javascript Rails:如何获取当前用户&x27;使用Heroku时的时区,javascript,ruby-on-rails,heroku,Javascript,Ruby On Rails,Heroku,我使用以下方法将Heroku网站的时区设置为太平洋标准时间(PST): 用户的时间现在总是在PST中——不管他们是否在PST时区 <%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 获取用户实际时区(即他们实际所在的时区)的最佳方法是什么 我猜这可以用Rails(或Javascript?)来解决,而不是Heroku。有两种方法 实际上,您可以使用javascript获取

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

用户的时间现在总是在PST中——不管他们是否在PST时区

<%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 
获取用户实际时区(即他们实际所在的时区)的最佳方法是什么


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

有两种方法

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

    因为您使用的是Rails,所以推荐的方法是将javascript打包为gem,如。这使得它易于安装(因为它在资产管道中自动绑定)

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

    <%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 
    
    使用IP地址,你可以得到他们的大致城市和纬度/经度。有很多gem可以做到这一点,例如,通过纬度/经度,你可以使用gem之类的工具获得时区


您还可以使用上述选项之一,并允许用户在您的网站上手动更改其时区(如果已注册,则将此设置存储在数据库中,或者在其浏览器上作为cookie)。这在时区错误的情况下非常有用。

根据应用程序的设置方式,有几种方法可以做到这一点。这些方法都不是Heroku环境独有的

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

>> rails generate migration add_time_zone_to_users time_zone:string
>> rake db:migrate
Rails为您提供了一个方便的时区选择表单帮助器,它为您提供了一个包含所有时区的选择列表,您可以将其显示给用户。将其添加到用户注册表单中,并允许用户在注册时设置时区。

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

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。为此,可以在date对象上使用本机javascript
getTimezoneOffset()
,或者更好地使用以下jsTimezoneDetect插件:


最后,您可以使用两者的混合,首先使用javascript检测它们的时区偏移量,然后将该值存储在rails会话/cookie中,然后使用before_过滤器如上所述设置time.zone,但要基于先前在javascript中计算的会话时区值。

或者您可以使用此方法

我一直在浏览网页,似乎我需要在客户端使用JS做些什么,然后将其传递回服务器。请给出建议。显然,这种方法存在缺陷,因为它依赖于隐藏的jstimezone。