Список выбора часового пояса в Ruby по смещению UTC - PullRequest
1 голос
/ 08 ноября 2010

Я бы хотел, чтобы выборка отображалась по разнице смещения относительно 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

Мы используем Синатру + Падрино.

Ответы [ 4 ]

1 голос
/ 07 февраля 2012

Как насчет этого:

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]...]
0 голосов
/ 12 ноября 2018

Я сделал так, что более удобно, я думаю

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

А в эрб

<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 } 
0 голосов
/ 25 апреля 2018

Вы можете использовать это:

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

Таким образом, вы можете получить все часовые пояса со смещением

0 голосов
/ 08 ноября 2010

Я придумал это:

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

Знаете ли вы лучшее решение (возможно, чище / быстрее)?

...