根据UTC偏移和夏令时自动检测Rails中的时区

4
我想用Rails自动检测用户的时区。我可以在用户的浏览器中使用此JS代码(http://www.onlineaspect.com/2007/06/08/auto-detect-a-time-zone-with-javascript/),以用户的时区发送包含UTC偏移量和夏季是否观察DST的表单。

一旦我在服务器上获得这些信息,我想选择匹配的时区。在Rails中,我可以使用ActiveSupport::TimeZone.all获取时区列表。此外,我还可以通过utc_offset方法过滤时区。但是,我不知道如何过滤观察或不观察DST的时区。

例如,假设用户住在阿姆斯特丹。按UTC偏移量过滤将返回柏林、贝尔格莱德、马德里等时区以及西非中部。除了西非中部之外,所有这些时区都适合阿姆斯特丹的用户(因为它们提供相同的时间/日期),但我需要过滤不执行夏季DST的西非中部。

我该如何在Rails中实现这个功能?另外,我的任何假设是否错误?

1个回答

1

我觉得http://geokit.rubyforge.org/可能会有所帮助。你可以获得用户位置(或城市/国家)的坐标。唯一需要做的是根据城市/国家猜测时区。


事实上,在我的情况下,我甚至有位置的纬度和经度,但是放弃了这种方法。获取某个给定的纬度和经度的相关时区并不容易。Geonames提供了一种通过纬度和经度获取时区的方法,但是提供的命名方案与Rails不同(因此我必须通过UTC偏移量猜测时区,并且在这种情况下我没有关于DST的信息)。 - Jose
更新:Geonames在响应中提供DST信息。然而,我有同样的问题:如何获取Rails的时区,考虑到DST和UTC偏移量。 - Jose
2
我终于解决了!由于Rails没有包含所有Geonames的时区,我已经将缺失的时区映射到最佳候选项,考虑到UCT偏移和DST。其中有几个无法解决,但这些情况非常罕见。您可以在Rails应用程序中包含此初始化程序(http://pastie.org/975171),并享受基于纬度和经度的时区检测。 - Jose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接