Rails 大家在项目中是怎样设置时区的?

darkbaby123 · 2012年12月08日 · 最后由 kgen 回复于 2012年12月11日 · 7081 次阅读

我有一个项目,采用 Rails 默认的时区设置,就是保存进数据库的是 UTC 时间,然后在 Controller 层面根据每个用户在 before_filter 里设置 Time.zone,达到转换时间的目的。

至于怎么根据用户设置时区,目前的做法是,页面上给一个下拉框,让用户选择一个时区,选择后存入 session,刷新一遍页面,以后每次页面请求就从 session 里取值赋给 Time.zone。

现在的问题是:每次打开浏览器,都要先选择一下时区,而且可以随意改,感觉不是很友好。举个例子,大部分人不会去手动改时区,他们需要的是页面打开后,时间相关的地方就是他们的本地时间。

请问有没有什么办法,能够在一个用户初次打开页面时,服务端就能在那次请求中“猜出”客户端的时区,然后把 Time.zone 设置好?或者有没有什么人性化的办法去做到这一点?

各位在项目中都是怎么用的?

我们目前的运维平台是把时区 code 保存到用户表中,在添加用户的时候就直接给用户设置好了默认时区,当然用户自己可以自由修改。

根据 IP 获得地理位置,就能得到当地的时区了。

我记得 redmine 后台有个设置时区的功能,不知道它们是怎么做的,你可以参考参考它们的代码!

@uudui 我也想这样弄,但有些页面是用户不登录也能看的,所以没办法。。。 @kgen 法子不错!但貌似比较麻烦,要去找 ip 和地理位置的对应表吧,而且要 ip -> 地理位置 -> 时区。 @zlx_star 我去看看。

#4 楼 @darkbaby123 ip 与地理位置对应是很常见成熟的做法,有现成的 gem 可以用。https://github.com/mtodd/geoip

服务端返回 UTC,在客户端用 js,获取时区,再来显示: new Date().getTimezoneOffset()

#4 楼 @darkbaby123 IP 地址到地理位置,可以用 MaxMind 的数据库(免费版数据延迟有 1 个月),然后用 @camel 推荐的那个插件集成即可。这些东西都非常成熟了,对开发工作量影响不大。

@kgen 嗯,我也看了。有一个免费数据库,每个月的周二更新,不过不知道跟收费数据库差别多大。我看他们网站发的每个 city 的误差表,好像还是有点的。主要是如果识别不出来还是要搞一套备选方案。我们还是用 js 算了,简单有效,这个 ip 表有时间自己玩玩再说。

#9 楼 @darkbaby123 要是差别不大的话,他们收费版就卖不动啦 :-P

需要 登录 后方可回复, 如果你还没有账号请 注册新账号