2010-11-07 56 views

回答

0

我想出了這一點:

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 

你知道有什麼更好的解決方案(也許清潔/更快)?

+1

這屬於你的問題,不是一個答案:) – s84 2010-11-07 22:37:22

+0

看起來真的很酷,希望它的作品。 – s84 2010-11-07 22:38:31

+0

我不認爲'all_linked_zones'是正確的,它只提供少量的地方。您應該使用其他方法之一。但是,請注意,除非您執行某種分組(例如,某個項目中的幾個城市),否則您將擁有很多項目。 – 2010-11-07 23:57:01

1

如何:

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

更好地使用tz.formatted_offset – 2014-05-14 21:04:44