2010-11-07 41 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