2012-03-10 2 views
21

В приложении Rails 3.x Мне нужно отображать сокращения времени (EST, PST, CST и т. Д.), А не полное имя часового пояса. Я видел ряд дискуссий, которые, похоже, рассматривают проблему, но в чрезмерно подробных манерах.Как перевести полные имена часовых поясов на аббревиатуры tz?

Есть ли драгоценный камень или очень сжатый способ обращения с этим, который может быть использован для правильного отображения их?

ответ

28

Для текущего часового пояса:

Time.zone.now.strftime('%Z') 

Или список часовых поясов:

ActiveSupport::TimeZone.us_zones.map do |zone| 
    Time.now.in_time_zone(zone).strftime('%Z') 
end 

Он работает, но он по-прежнему похоже, должен быть лучший способ ...

+1

Дайте мне знать, если вы найдете еще лучшее решение. Спасибо, что поделился. – ylluminate

+0

Это, безусловно, потерпит неудачу в следующем случае: 2.2.2: 059> Time.now.in_time_zone ("Indiana (East)"). Strftime ('% Z') => "EDT" 2.2.2: 060> Время .now.in_time_zone («Восточное время (США и Канада)»). strftime ('% Z') => «EDT» – AMBasra

2

Ну, если вы позволите своим пользователям выбирать свой часовой пояс, вы можете отобразить сокращенную область часового пояса как часть формата даты и времени. Попробуйте что-то вроде этого в вас appliction_helper.rb, а затем использовать его в целях форматирования Задан объект:

def format_datetime(datetime) 
    datetime.strftime "%-d %b %Y, %H:%M %Z" 
end 

Update

Если вы делаете геолокация на основе IP-адресов пользователей, то вы можете выполнить поиск по часовому поясу на основе этого местоположения. Этот вопрос действительно задавался раньше, но в отношении широты/долготы, а не названия заданного часового пояса.

Есть чтение этого один: Timezone lookup from latitude longitude

+0

Я вытягивать в часовом поясе с помощью их ip + геолокация, поэтому я разрешаю ее с более длинного имени. – ylluminate

+0

На самом деле мой вопрос немного конкретнее. У меня геолокация работает нормально. Проблема в том, что результатом является более длинная версия часового пояса. Я ищу, чтобы получить EST (EDT), PST (PDT), UTC, IST и т. Д. – ylluminate

5
Time.now.zone 
# => "UTC" 

Чтобы использовать часовой пояс по умолчанию (если он установлен), вы можете использовать:

Time.zone.now.zone 
# => "CDT" 

Более подробную информацию о том, что: http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D

+0

Это также потерпит неудачу в следующем случае Time.now.in_time_zone («Восточное время» (US & Канада)").зона => «EDT» 2.2.2: 065> Time.now.in_time_zone («Индиана (Восток)»). зона => «EDT» Его сложно использовать для экономии дневного света и для зон с одинаковыми таймингами для примера вышеупомянутые обе зоны составляют GMT -5. Так что рубин смущен. – AMBasra

4

Я посмотрел всего этого ответа, и я, наконец, нашел то, что искал. Я уезжаю ответ здесь, чтобы другие не могли бы выглядеть почти так же долго и упорно, как я должен был.

Если у вас есть доступ к ActiveSupport и работе с TimeZone объектами, как это:

timezone = ActiveSupport::TimeZone.all[44] 

, то вы можете добраться до аббревиатуры таким образом:

timezone.tzinfo.current_period.abbreviation 
+0

информация о зоне находится в tzinfo, однако это в основном более длинный способ просто сделать то, что упоминалось выше, например ifaitcrime ... User.take.created_at.zone – hellion

+0

Вы также можете использовать 'strftime', чтобы получить аббревиатуру непосредственно из 'TZInfo :: TimezoneProxy'. – roflmyeggo

Смежные вопросы