Формат даты по умолчанию в Rails (нужно, чтобы он был ddmmyyyy)

Я работаю с рельсами в течение всего дня, и я просто случайно тестировал его и пробовал дату 25/12/2009, и он придумал огромную ошибку.

Именно в этот момент я понял, что рельсы настроены на американский режим даты (мм/дд/гггг) вместо британского стиля: дд/мм/гггг.

Как настроить рельсы для автоматической обработки всех дат в формате dd/mm/yyyy?

Ответы

Ответ 2

Если вы используете решение @Chris Ballance, обратите внимание, что Rails теперь изменяет класс Date напрямую, поэтому вы получите ошибку uninitialized constant ActiveSupport с решением.

См: неинициализированная константа ActiveSupport:: CoreExtensions

Обновленный аргумент:

my_date_formats = { :default => '%d/%m/%Y' } 
Time::DATE_FORMATS.merge!(my_date_formats) 
Date::DATE_FORMATS.merge!(my_date_formats)

Ответ 3

Вы можете изменить формат даты с помощью интернационализации (I18n)

Просто добавьте (или измените) это в свой config/locales/en.yml:

en:
  date:
    order:
      - :day
      - :month
      - :year

Ответ 5

Обновлен I18n...

date:
  formats:
    default: "%m/%d/%Y"
    short: "%b %d"
    long: "%B %d, %Y"

Ответ 6

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

приложение/модели/mymodel.rb

class Mymodel < ActiveRecord::Base
  include ValueFormatters
  add_value_formatters

  etc.
end

Библиотека /value _formatters.rb

module ValueFormatters
  extend ActiveSupport::Concern

  module ClassMethods

    def add_value_formatters
      columns.each do |column|
        case column.type
          when :datetime
            define_method("#{column.name}_formatted") { General.format_datetime(self.read_attribute(column.name)) }
            define_method("#{column.name}_formatted=") {|value| self.update_attribute(column.name, General.parse_datetime(value)) }
          when :date
            define_method("#{column.name}_formatted") { General.format_date(self.read_attribute(column.name)) }
            define_method("#{column.name}_formatted=") {|value| self.update_attribute(column.name, General.parse_date(value)) }
          when :boolean
            define_method("#{column.name}_formatted") { General.format_boolean(self.read_attribute(column.name)) }
            define_method("#{column.name}_formatted=") {|value| self.update_attribute(column.name, General.parse_boolean(value)) }
          else
            # do nothing
        end unless self.class.respond_to?("#{column.name}_formatted")
      end
    end

  end

end

Библиотека /general.rb

class General

  def self.parse_date(value, end_of_day = false)
    result = nil
    begin
      if value.present?
        if value.length == 8
          result = DateTime.strptime(value, '%d/%m/%y')
          if result.year > Time.new.year + 1
            result = DateTime.new(result.year - 100, result.month, result.day)
          end
        else
          result = DateTime.strptime(value, '%d/%m/%Y')
        end
      end
    rescue Exception=>e
      #
    end
    result = result + 23.hours + 59.minutes + 59.seconds if result && end_of_day
    result
  end

  def self.parse_datetime(value)
    result = nil
    begin
      if value.present?
        result = DateTime.strptime(value, '%d/%m/%Y %H:%M')
        result = nil if result < 100.years.ago
      end
    rescue Exception=>e
      #
    end
    result
  end

  def self.format_date(value)
    value.present? ? value.strftime('%d/%m/%Y') : ''
  end

  def self.format_datetime(value)
    value.present? ? value.strftime('%d/%m/%Y at %H:%M') : ''
  end

  def self.format_boolean(value, default = nil)
    value = default if value == nil
    case value
      when true
        'Yes'
      when false
        'No'
      else
        'Unspecified'
    end
  end

  def self.parse_boolean(value, default = false)
    case value.to_s.downcase
      when 'true'
      when 'yes'
      when '1'
      when 'on'
        true
      when 'false'
      when 'no'
      when '0'
      when 'off'
        false
      else
        default
    end
  end

end