Por defecto en rails tenemos dos tipos de objectos para gestionar fechas los objectos date (de aquí en adelante "_on") que permiten guardar una fecha con año, mes y día y los objetos timestamp (de aquí en adelante "_at") que permiten guardar una fecha con año, mes, día, hora, minuto y segundo (sin zona horaria). Sus formato de salida por defecto son:
Fecha (output):
Fecha (input):
Utilizar la API de internacionalización de RAILS, resumo los pasos de forma rápida:
- Descargar los "locales" que no interesen de https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale
- Copiarlos en "config\locales\" los que vayamos a utilizar.
- En el fichero "config\aplication.rb" descomentar la siguientes línias
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
# config.i18n.default_locale = :de - Y establecer nuestro idioma por defecto, para español sería:
config.i18n.default_locale = :es - Reiniciar el servidor web
Con lo que hemos solucionado las entradas de fecha (input), pero no las salidas (output). Para solucionar las salidas tenemos que:
- Crear el fichero "initializers\date_formats.rb"
- Añadir:
Time::DATE_FORMATS[:default] = lambda { |time| I18n.l(time) }
Date::DATE_FORMATS[:default] = lambda { |date| I18n.l(date) }
- Reiniciar el servidor web
En mi caso el formato por defecto para el locale ca (catalán) no era el deseado, con lo que abrí "config\locales\ca.yml" y modifiqué "default: "%A, %d de %B de %Y %H:%M:%S %z"" por "default: "%d de %b %H:%M""
Solución alternativa (sin internacionalizar):
Una solución única:
- Crear el fichero "initializers\date_formats.rb"
- Añadir nuestra definición de formatos. Ejemplo:
DATE_AT_FORMAT = "%d/%m/%Y %H:%M"
DATE_ON_FORMAT = "%d/%m/%Y"
Time::DATE_FORMATS.merge!(
:standard => DATE_AT_FORMAT,
:default => DATE_AT_FORMAT,
:standard_time => DATE_AT_FORMAT
)
Date::DATE_FORMATS.merge!(
:standard => DATE_ON_FORMAT,
:default => DATE_ON_FORMAT,
:standard_time => DATE_ON_FORMAT
)
La siguiente alternativa también funciona:
DATE_AT_FORMAT = "%d/%m/%Y %H:%M"
DATE_ON_FORMAT = "%d/%m/%Y"
Time::DATE_FORMATS[:default] = DATE_AT_FORMAT
Date::DATE_FORMATS[:default] = DATE_ON_FORMAT
<%= f.datetime_select :start_at, :order => [:day, :month, :year]%>
<%= f.date_select :start_on, :order => [:day, :month, :year] %>