2009-10-22 79 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"