我使用以下方法将 Heroku 网站的时区设置为太平洋标准时间 (PST):
heroku config:add TZ=America/Los_Angeles
用户的时间现在总是在 PST 中——无论他们是否在 PST 时区。
获取用户实际时区(即他们实际所在的时区)的最佳方法是什么?
我猜这可以使用 Rails(或 Javascript?)来解决,而不是 Heroku。
我使用以下方法将 Heroku 网站的时区设置为太平洋标准时间 (PST):
heroku config:add TZ=America/Los_Angeles
用户的时间现在总是在 PST 中——无论他们是否在 PST 时区。
获取用户实际时区(即他们实际所在的时区)的最佳方法是什么?
我猜这可以使用 Rails(或 Javascript?)来解决,而不是 Heroku。
有两种方法可以做到这一点。
事实上,您可以使用 javascript 来获取他们当前的时间/时区。有可能是用户的计算机时间设置不正确,在这种情况下您显示的时区将不正确。
因为您使用的是 Rails,所以推荐的方法是将 javascript 捆绑为 gem,例如detect_timezone_rails
. 这使它易于安装(因为它全部自动捆绑在资产管道中。
您可以使用 IP 地址来推断他们的国家和时区。这种情况下的危险是用户可能正在使用代理。此外,虽然 IP 地址通常具有城市级别的分辨率,但它可能或多或少准确,在极少数情况下可能会给出错误的时区。
使用 IP 地址,您可以获得他们的大致城市和纬度/经度。在Ruby Toolbox上有很多 gem 可以做到这一点,例如。geocoder
. 使用纬度/经度,您可以使用像timezone
.
您还可以使用上述方法之一,并允许用户在您的网站上手动更改他们的时区(如果已注册,则将此设置存储在数据库中,或者作为浏览器上的 cookie)。这在您弄错时区时很有用。
根据您的应用程序设置方式,您可以通过多种方式执行此操作。这些都不是 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 中。
或者你可以使用这个很棒的 gem https://github.com/kbaum/browser-timezone-rails