Ruby 中的时区选择列表(按 UTC 偏移量)

发布于 2024-10-01 05:38:06 字数 414 浏览 2 评论 0原文

我想要一个按 UTC 偏移差列出的选择,例如:

<select value=1>(GMT 00:00) GMT</select>
<select value=1>(GMT 00:00) Lisbon</select>
<select value=1>(GMT +00:01) Madrid</select>

就像在 Rails 中一样: https://signup.37signals.com/highrise/Free/signup/new

我们正在使用 Sinatra+Padrino。

I would like to have a select listed by offset difference to UTC, like:

<select value=1>(GMT 00:00) GMT</select>
<select value=1>(GMT 00:00) Lisbon</select>
<select value=1>(GMT +00:01) Madrid</select>

Just like in Rails:
https://signup.37signals.com/highrise/Free/signup/new

We're using Sinatra+Padrino.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

若水微香 2024-10-08 05:38:06

怎么样:

ActiveSupport::TimeZone.all.inject([]) do |result, tz|
  utc_offset = tz.utc_offset / 3600
  result << ["(UTC #{'%.2d' % utc_offset}): #{tz.name}", utc_offset]
end

它将为 options_for_select 生成一个数组:

[["(UTC -11): International Date Line West", -11], ["(UTC -11): Midway Island", -11]...]

How about this:

ActiveSupport::TimeZone.all.inject([]) do |result, tz|
  utc_offset = tz.utc_offset / 3600
  result << ["(UTC #{'%.2d' % utc_offset}): #{tz.name}", utc_offset]
end

It will produce an array for options_for_select:

[["(UTC -11): International Date Line West", -11], ["(UTC -11): Midway Island", -11]...]
我爱人 2024-10-08 05:38:06

您可以使用这个:

arr = TZInfo::Timezone.all_country_zone_identifiers.collect { |x| x + " " + ActiveSupport::TimeZone[x].formatted_offset }
arr.sort

这样您就可以获取带有偏移量的所有时区

You can use this:

arr = TZInfo::Timezone.all_country_zone_identifiers.collect { |x| x + " " + ActiveSupport::TimeZone[x].formatted_offset }
arr.sort

This way you can get all time zones with offset

妥活 2024-10-08 05:38:06

我想出了这个:

timezones_diff_and_name = []
  TZInfo::Timezone.all_linked_zones.each do |tz|
    timezones_diff_and_name << {tz.name => tz.current_period.utc_total_offset / (60 * 60)}
  end

  sorted_timezones = timezones_diff_and_name.sort_by { |timezone| timezone.values[0] }

  @timezones = {}
  sorted_timezones.each do |tz|
    diff = tz.values[0]
    name = tz.keys[0]
    @timezones["(GMT#{diff > 0 ? '+':''}#{diff.to_s}h) #{name}"] =  name
  end

你知道有更好的解决方案(也许更干净/更快)吗?

I came up with this:

timezones_diff_and_name = []
  TZInfo::Timezone.all_linked_zones.each do |tz|
    timezones_diff_and_name << {tz.name => tz.current_period.utc_total_offset / (60 * 60)}
  end

  sorted_timezones = timezones_diff_and_name.sort_by { |timezone| timezone.values[0] }

  @timezones = {}
  sorted_timezones.each do |tz|
    diff = tz.values[0]
    name = tz.keys[0]
    @timezones["(GMT#{diff > 0 ? '+':''}#{diff.to_s}h) #{name}"] =  name
  end

Do you know any better solution (maybe cleaner/faster)?

森林迷了鹿 2024-10-08 05:38:06

我这样做了,我认为这对用户更友好,

@total_timezones = {}
ActiveSupport::TimeZone.all.uniq(&:utc_offset).each{  |item|
    @total_timezones.merge!({"(UTC"+ item.formatted_offset.to_s + ") " + item.name => item.utc_offset}) 
}

并且在 erb 中

<div class="col-xs-4">
            <select class="form-control" name="tz_offset">
            <%= options_for_select(@total_timezones.each, @timeline_emails.tz_offset) %>
            </select>
</div>

还有另一个没有前面部分的例子,其中包括整个时区,包括基里巴斯群岛 +14 ,它不在最常用的标准时区中。

 TZInfo::Timezone.all_country_zone_identifiers.each { |item|  @total_timezones.merge!({"(UTC" +  ActiveSupport::TimeZone[item].formatted_offset + ") " + item => ActiveSupport::TimeZone[item].formatted_offset}) }
 @total_timezones = @total_timezones.sort_by { |key, value| value.scan(/-?\d+/).join.to_i } 

I made like this which is more user-friendly I think

@total_timezones = {}
ActiveSupport::TimeZone.all.uniq(&:utc_offset).each{  |item|
    @total_timezones.merge!({"(UTC"+ item.formatted_offset.to_s + ") " + item.name => item.utc_offset}) 
}

And in erb

<div class="col-xs-4">
            <select class="form-control" name="tz_offset">
            <%= options_for_select(@total_timezones.each, @timeline_emails.tz_offset) %>
            </select>
</div>

And another example without the front part which includes whole timezones including Kiribati Islands +14 which is out from most used standard timezones.

 TZInfo::Timezone.all_country_zone_identifiers.each { |item|  @total_timezones.merge!({"(UTC" +  ActiveSupport::TimeZone[item].formatted_offset + ") " + item => ActiveSupport::TimeZone[item].formatted_offset}) }
 @total_timezones = @total_timezones.sort_by { |key, value| value.scan(/-?\d+/).join.to_i } 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文