2010-11-07 4 views

Répondre

0

je suis venu avec ceci:

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 

Savez-vous une meilleure solution (peut-être plus propre/plus rapide)?

+1

cela appartient à votre question, non pas comme une réponse :) – s84

+0

l'air vraiment cool, espérons que cela fonctionne. – s84

+0

Je ne pense pas que 'all_linked_zones' soit correct, il ne donne qu'un petit nombre de places. Vous devriez utiliser l'une des autres méthodes. Notez, cependant, que vous aurez BEAUCOUP d'objets, sauf si vous effectuez une sorte de regroupement (plusieurs villes dans un élément, par exemple). –

1

Que diriez-vous ceci:

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

Il produira un tableau pour options_for_select:

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

Mieux utiliser tz.formatted_offset –

Questions connexes