首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >time_zone_options_for_select将小时打印到UTC偏移量作为值

time_zone_options_for_select将小时打印到UTC偏移量作为值
EN

Stack Overflow用户
提问于 2014-08-08 09:05:07
回答 1查看 291关注 0票数 0

我有这个代码让用户选择他们的时区。

代码语言:javascript
复制
<%= time_zone_options_for_select(@corp.timezone, nil, ActiveSupport::TimeZone) %>

问题在于代码生成这个html。

代码语言:javascript
复制
<option value="American Samoa">(GMT-11:00) American Samoa</option>

我需要它像下面这样

代码语言:javascript
复制
<option value="-11:00">(GMT-11:00) American Samoa</option>

我怎么能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-08 09:20:17

有什么特别的原因需要存储偏移量吗?我建议简化如下:

保持相同的视图

代码语言:javascript
复制
time_zone_options_for_select(@corp.timezone, nil, ActiveSupport::TimeZone)

模型

代码语言:javascript
复制
validates :timezone, inclusion: { in: ActiveSupport::TimeZone.zones_map.keys }

转换

代码语言:javascript
复制
DateTime.now.in_time_zone(@corp.timezone)

DateTime.now.in_time_zone("Hawaii")
# => Thu, 07 Aug 2014 23:19:03 HST -10:00

不过,回答你的问题。请参阅time_zone_options_for_select文档和源代码。

最后一个论点是一个模型。在这种情况下,ActiveSupport::TimeZone。然后使用model.all获取时区列表,并提取标签、值(分别为[instance.to_s, instance.name] )。

注意,每个TimeZone实例都有utc_offset

代码语言:javascript
复制
TimeZone.new("Hawaii").utc_offset
# => -36000

这意味着您可以传递time_zone_options_for_select您自己的实现self.all和修补程序instance.name的自定义类。

您还可以跳过time_zone_options_for_select并使用options_for_select,传入这个自定义数组:

辅助对象

代码语言:javascript
复制
def timezone_options
  ActiveSupport::TimeZone.all.map do |zone|
    [zone.to_s, timezone_to_offset_string(zone)]
  end
end

def timezone_to_offset_string(timezone)
  (timezone.utc_offset / 3600).to_s + ":00"
end

视图

代码语言:javascript
复制
options_for_select(timezone_options, @corp.timezone)

但是,您从priority中失去了time_zone_options_for_select选项。所以,正如你所看到的,最好还是坚持惯例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25199736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档