ruby-on-rails - 如何将 TZInfo 标识符转换为 Rails 时区名称/键

标签 ruby-on-rails ruby-on-rails-3 timezone activesupport tzinfo

如何将作为 TZInfo 标识符接收的 js 值转换为 Rails TimeZone 名称/键?

发件人:"America/New_York"从 JavaScript TZinfo 检测返回
收件人:"Eastern Time (US & Canada)" Rails TimeZone 中使用的约定

或另一个例子:"Pacific/Honolulu" => 转换为 => "Hawaii"
两者均可在 ActiveSupport::TimeZone < Object 中获得映射但 rails 使用 key [i.g. "Eastern Time (US & Canada)" ] 在下拉菜单中,验证和存储到 Time.use_zone() .

根据我对 ActiveSupport::TimeZone.us_zones 的了解这似乎很重要,尤其是在 DayLights 节省时间(这听起来很好处理)并且仅匹配偏移量无法实现的情况下。如果它没有使用 rails TimeZone 名称存储到 DB 中,则验证将失败并且在用户的配置文件设置页面中与下拉列表 ActiveSupport::TimeZone.zones_map 不正确匹配。

这样做的目标是用户不必在注册时选择他们的时区,也不必在注册后在他们的设置中更改时区。浏览器检测到它并在注册时将其传递给 hidden_​​field。在极少数情况下,他们会在与家庭/工作地点不同的地方注册。他们可以稍后在他们的帐户设置中手动覆盖。

尝试摄取 js 时区检测时似乎是一个常见的差距。这甚至可能成为一个次要问题,即如何将返回的信息从 js 传递到 rails 进行转换,然后返回到 js 以存储回表单的 hidden_​​field 中?希望我正确地提出了这个问题,诚然,用 rails 有点绿色,所以可能有一个简单的解决方案......

非常感谢所有的帮助!
-E

ActiveSupport 时区文档
http://api.rubyonrails.org/classes/ActiveSupport/TimeZone.html#method-i-parse

MAPPING = {"Eastern Time (US & Canada)" => "America/New_York"

使用 js 打包的 gem 'temporal-rails' 检测用户时区:
https://github.com/jejacks0n/temporal

用户 Time_Zone 实现如下:
http://railscasts.com/episodes/106-time-zones-revised

*使用设计和设计-不可避免

注册 View 脚本
    <script>
    $(function() {
        var detected_zone = Temporal.detect();
        console.log(detected_zone);  // returns object
        detected_zone = detected_zone.timezone.name;
        console.log(detected_zone);  // returns "America/New_York"
        $('#user_time_zone').val(detected_zone);  // ! need to convert this to rails TimeZone name !
    });
    </script>

用户模型
    validates_inclusion_of :time_zone, in: ActiveSupport::TimeZone.zones_map(&:name)

用户帐户设置表单
    <%= f.label :time_zone, label: "Time Zone" %><br />
    <%= f.time_zone_select :time_zone, ActiveSupport::TimeZone.us_zones %>

最佳答案

Temporal 包括所需的逻辑,但要回答您的问题:
Time.zone = ActiveSupport::TimeZone.new("America/New_York")
编辑,我想我的答案不完整。您想将它从“美国/纽约”获取到“东部时间(美国和加拿大)”,对吗?如果是这种情况,这是我拥有的最佳解决方案——尽管有人可能会提供更好的解决方案。
ActiveSupport::TimeZone::MAPPING.select {|k, v| v == "America/New_York" }.keys.first

关于ruby-on-rails - 如何将 TZInfo 标识符转换为 Rails 时区名称/键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221615/

相关文章:

c# - 将 DateTime 格式化为带有时区的本地字符串

python - 具有不同时区的 APScheduler

jquery - 创建帖子时如何使用 JQuery-File-Upload 在一页上上传多张图片?

ruby-on-rails - rails Assets 管道 "Cannot allocate memory - nodejs"

ruby-on-rails - 选择不显示所选值

ruby-on-rails - 在 ruby​​ on rails 中包含 httparty 的问题

ruby-on-rails-3 - 疯狂安装未定义的方法mass_assignment_sanitizer

C# 与 Unix 时间戳相互转换

ruby-on-rails - 无方法错误 : undefined method `pluck' for #<Model>

ruby-on-rails - 如何在 simple_form 中生成取消按钮?