Rails中的默认日期格式(需要它是ddmmyyyy)

时间:2009-10-22 22:58:42

标签: ruby-on-rails

我一直在使用rails表格,我只是随机测试它并尝试了日期25/12/2009,它出现了一个巨大的错误。

就在这时,我意识到导轨设置为美国日期模式(mm / dd / yyyy)而不是英国风格:dd / mm / yyyy。

如何设置rails以自动处理dd / mm / yyyy格式的所有日期?

6 个答案:

答案 0 :(得分:24)

如果你正在使用@Chris Ballance的解决方案,请注意Rails现在可以直接修改Date类,因此解决方案会出现uninitialized constant ActiveSupport错误。

请参阅: uninitialized constant ActiveSupport::CoreExtensions

更新后的论点:

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

答案 1 :(得分:9)

在您的设置文件中:config / environment.rb“

my_date_formats = { :default => '%d/%m/%Y' } 

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(my_date_formats) 

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(my_date_formats) 

源: http://thedevelopercorner.blogspot.com/2009/03/change-default-date-format-in-ruby-on.html

答案 2 :(得分:6)

您可以使用国际化(I18n)

更改日期格式

只需在config / locales / en.yml中添加(或更改):

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

答案 3 :(得分:1)

你正在寻找更多这样的东西,尽管这个解决方案仍然不太优雅。

http://source.mihelac.org/2006/9/13/parsing-european-date-format-in-ruby-rails

答案 4 :(得分:1)

更新了I18n ......

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

答案 5 :(得分:0)

我通过添加名为mydatefield_formatted的getter和setter来解决这个问题,该getter和setter明确地执行我想要的操作,并在任何地方使用它们。可能是购买清单的理由不这样做,但我非常喜欢它,所以我想我会留在这里。

应用/模型/ mymodel.rb

class Mymodel < ActiveRecord::Base
  include ValueFormatters
  add_value_formatters

  etc.
end

<强> LIB / 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

<强> LIB / 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