我知道很难检测到用户的时区,因此向用户显示可用时区并让他们选择是最佳做法。
如何为Rails生成此内容?
我也将如何使用它?我应该将其保存为字符串" US / Michigan"当我想处理一些与用户相关的cron任务时,使用一些类方法在我当前的服务器时间转换它?
答案 0 :(得分:0)
TZInfo gem应该对您有所帮助:
http://www.rubydoc.info/gems/tzinfo/frames
(在Windows上,您还需要tzinfo-data来支持它,在其他操作系统上你不应该这样做)。
有很多时区,所以我不确定是否显示所有这些时区的列表是最好的用户界面。但你可以。
TZInfo::Timezone.all
将所有时区作为TZInfo :: Timezone对象返回。 (583件物品)。要获取每个时区的规范标识符,您可以执行以下操作:
TZInfo::Timezone.all.collect(&:canonical_identifier)
看起来某些规范标识符的格式为“#34; America / New York"”,但其他标识符不是。 "利比亚","埃及",技术性的东西,如" Etc / GMT + 7" - 所以也许你真的不想展示所有这些。看起来不是TZInfo::Timezone.all
,而是使用ZInfo::Timezone.all_country_zone_identifiers
来获得更多"正常"一些(仍然是418)。
您还可以选择让用户先选择一个国家/地区,然后从该国家/地区中选择一个时区 - TZInfo支持该时区,按国家/地区分组时区,请参阅自述文件以获取更多信息。
我不确定这里最好的用户界面是什么。如果我是你,我会尽可能多地查看网站和应用程序以了解他们是如何做到的 - 尽管可能很难找到任何让用户选择时区的网站和应用程序!弄清楚正确的用户界面并实施它是两个独立的问题。但是一旦你找到你想要的UI,TZInfo gem就会给你实现它所需要的东西。
我认为你可能做想要'检测'首先是用户的时区,只有当他们发现检测错误时才强制他们选择它。我不确定尝试和检测的最佳方法。我没有使用它,但是[这里是一个Javascript库]试图检测用户的当前时区作为规范标识符,您应该能够使用TZInfo实际转换为GMT或其他时区。
时区通过像#" America / New York"这样的字符串正式唯一标识,所以这就是存储为代表时区的意义,是的。 TZInfo将为您提供获取这些规范标识符所需的方法,并使用它们来获取可用于从该时区的本地时间转换为GMT或服务器时间的时区对象。 (您可能最好总是在代码中使用GMT并将其作为GMT存储在数据库中,而不是“服务器本地时间”)。