RDR3R > Простое форматирование дат в Ruby on Rails

августа 3, 2011  |  Published in Ruby on Rails, Ruby on Rails 3  |  10 Comments

В этой совсем простой статья я расскажу о том как легко и просто можно форматировать дату и время в ваших приложениях на основе Ruby on Rails без использования стороннего кода.

Начну с того, что в Ruby on Rails, а точнее в ActiveSupport в расширениях для Ruby присутствует расширения для класса Date. Полный путь, если что выглядит так: .  Это расширение базового Date содержит в себе константу DATE_FORMATS которая позволяет сохранять форматы даты и времени и давать им имена (DATE_FORMATS является хэшем). Благодаря этому вы можете один единственный раз определив необходимый вам формат повсеместно использовать его в вашем приложении.

Рассказываю свой рецепт:

1. Открываю файл ../config/environment.rb.

2. Определяю формат:

Time::DATE_FORMATS[:ru_datetime] = "%Y.%m.%d в %k:%M:%S"
#поскольку я использовал кириллицу, мне пришлось в начале прописать:
# #encoding: utf-8

3. Использую необходимое форматирование:

article.created_at.to_s(:ru_datetime)

4. Смотрю результат:
2011.08.01 в 20:50:36

Все очень просто!

В качестве бонуса привожу список спецсимволов с описанием, список на английском взят здесь():

Коды форматирования для strftime в  Ruby on Rails:
Год
%Y     год и столетие (2011)
%y     только год (11)
%C     столетие (год деленный на 100)

Месяц
%B     полное название месяца January
%b     сокращенное название месяца Jan
%h     то же, что и %b Jan
%m     месяц числом (01-12)

Неделя
%U     номер недели, первый день — воскресенье (00-53)
%W     номер недели, первый день — понедельник (00-53)

День
%A     название дня недели Wednesday
%a     сокращенное название дня недели Wed
%d     день месяца (01-31)
%e     день месяца без нуля ( 1-31)
%j     день года (001-366)
%w     номер дня недели, 0 — воскресенье (0-6)
%u     номер дня недели, 0 — понедельник(1-7)

Время
%H     час (00-23)
%k     час без нуля ( 0-23)
%I     час в двенадцати-часовом формате (01-12)
%l     час в двенадцати-часовом формате без нуля ( 1-12)
%M     минута (00-59)
%S     секунда (00-59)
%p     указываем время до полудня(AM) и после полудня(PM)
%Z     имя временной соны или аббревиатура EDT
%z     временное смещение от UTC (координированное универсальное время) -0400

Предопределенные шаблоны форматирования
%D     формат даты как при %m/%d/%y (05/16/11)
%v     формат даты как при %e-%b-%Y (16-May-2011)
%F     формат даты как при %Y-%m-%d 2011-05-16
%R     формат времени в 24 ч. представлении, ка при %H:%M (18:06)
%T     формат времени в 24 ч. представлении, ка при %H:%M:%S 18:06:15
%r     формат времени в 12 ч. представлении, ка при %I:%M:%S %p 06:06:15 PM

Дополнительное форматирование
%n     символ новой строки
%t     символ табуляции
%%     символ «процент»

При помощи всего этого вы можете создавать практически любые необходимые вам форматы даты и времени.
Болеесложное форматирование даты и времени в Ruby on Rails
Что делать, если вам необходимо более сложное форматирование, помещение в форматирование логики, например вывод русских названий дней и месяцов, или текстовой, а не числовое представление времени и даты и т.д.? — Для этого можно воспользоваться, например лямбдой:

Time::DATE_FORMATS[:my_super_duper_format] = lambda { |dt|
  #а здесь у нас особая уличная магия!
}

Удачи вам в изучении Ruby on Rails! Спасибо за внимание к проекту RubyDev.ru.

Лучшая благодарность автору — ваши комментарии!

Tags: ,

Responses

  1. developer says:

    августа 4, 2011 at 03:42 (#)

    А чем плох способ использования стандартного механизма локализации rails? Для конфигурирования используем ru.yml, а выводим с помощью хелпера l @date, :formats => :our_format.

  2. says:

    августа 4, 2011 at 08:03 (#)

    Кстати, очень помогает в подборе шаблона даты и времени.

  3. Yury says:

    августа 4, 2011 at 10:18 (#)

    можно использовать трюк с локализацией

    # config/locales/en.yml

    en:
    date:
    formats:
    numeric: «%m/%d/%y»

    I18n.l(date, :format => :numeric)

  4. says:

    августа 4, 2011 at 10:57 (#)

    Можно еще проще (и лучше, на мой взгляд):

  5. says:

    августа 4, 2011 at 10:58 (#)

    Единственное что, сложное форматирование так не сделать.

  6. says:

    августа 4, 2011 at 10:58 (#)

    есть очень клевый гем для хуман френдли форматирования времени

  7. admin says:

    августа 4, 2011 at 11:45 (#)

    Gonzih, спасибо, я о нем уже писал: http://rubydev.ru/2011/07/stamp-date-time-formatting/

  8. admin says:

    августа 4, 2011 at 11:54 (#)

    Developer, Yury, Andy, i18n ничем не плох кроме того, что, как заметил Andy, сложное форматирование там невозможно, например как сделать, чтобы дата представлялась в текстовом формате «третье августа триста сорок восьмого года, ровно в полдень»? Используя представленный в статье рецепт можно написать очень крутую логику представления, это необходимо редко, но все же.

  9. says:

    февраля 18, 2012 at 22:38 (#)

    Доброго времени суток!

    Подскажите, пожалуйста, как сделать вывод даты в формате «10 Фев»? У меня не получается русифицировать это сообщение.

    gem russian — первый в Gemfile!

    config.i18n.default_locale = :ru

    в application.rb установлено!

    post.posted_at.strftime '%d %b'

    А этот код всё равно упорно продолжает возвращать «10 Feb».
    ЧЯДНТ?

  10. itsNikolay says:

    февраля 19, 2012 at 17:19 (#)

    Иногда требуется вывести дату в отечественном формате.
    Вот маленький туториал :)

    [:day, :month, :year,], :discard_hour=>true, :discard_minute=>true, :default=>DateTime.now %>

    :order=>[:day, :month, :year,] # Порядок вывода слева-направо
    :discard_hour=>true, :discard_minute=>true # Не выводить часы и минуты
    :default=>DateTime.now # Собственно значение по умолчанию

Leave a Response

Для подсветки кода используйте BB - коды: [language]...[/language], где language может быть: ruby, javascript, css, html.