2009-10-22 100 views
13

我一直在使用rails表格整天工作,我只是随机测试它,并尝试日期25/12/2009,它提出了一个巨大的错误。Rails中的默认日期格式(需要为ddmmyyyy)

正是在这一点上,我意识到,轨道设置为美国日期模式(mm/dd/yyyy)而不是英国风格:dd/mm/yyyy。

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

+1

无关的问题,但:DD/MM/YYYY是无处不在,但美国的风格,不只是在英国 – Pierre 2012-08-02 23:27:25

回答

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

+4

这只是处理输出标准......这是不是他的什么询问。 – Subimage 2009-11-13 02:14:41

+0

这是一个非常古老的答案,不适用于Rails 4或5。 – danielricecodes 2017-04-20 15:17:55

24

如果您使用@克里斯巴兰斯的解决方案需要注意的是,现在的Rails modifie直接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) 
6

您可以更改使用日期格式国际化(i18n)

只需添加(或更改)这个在你的config /区域设置/en.yml:

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

I通过添加名为mydatefield_formatted的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 
1

更新的I18n ...

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