martes, 20 de septiembre de 2011

Cambiando el formato de fecha

Si tu formato de fecha no es YYYY-MM-DD esto te puede interesar.

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):

Primer solución (y la oficial):

Utilizar la API de internacionalización de RAILS, resumo los pasos de forma rápida:
  1. Descargar los "locales" que no interesen de https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale
  2. Copiarlos en "config\locales\" los que vayamos a utilizar.
  3. 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
  4. Y establecer nuestro idioma por defecto, para español sería:
    config.i18n.default_locale = :es
  5. Reiniciar el servidor web
Con lo que tendremos:
Con lo que hemos solucionado las entradas de fecha (input), pero no las salidas (output). Para solucionar las salidas tenemos que:
  1. Crear el fichero "initializers\date_formats.rb"
  2. Añadir:
    Time::DATE_FORMATS[:default] = lambda { |time| I18n.l(time) }
    Date::DATE_FORMATS[:default] = lambda { |date| I18n.l(date) }
  3. Reiniciar el servidor web
Con lo que tendremos:
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:
  1. Crear el fichero "initializers\date_formats.rb"
  2. 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

Con esto habremos conseguido corregir los outputs, ahora si queremos corregir los inputs tendremos que ir uno por uno y añadir la línia ":order => [:day, :month, :year]", ejemplos:

    <%= f.datetime_select :start_at, :order => [:day, :month, :year]%>
    <%= f.date_select :start_on, :order => [:day, :month, :year] %>

1 comentario:

  1. Muchas gracias me salvaste, estaba usando la gema datepicker y por culpa del formato en ingles se bugeaba y con esto se reparo. gracias

    ResponderEliminar