2009-10-22 5 views
13

저는 하루 종일 레일 양식으로 작업 해 왔으며 무작위로 테스트를 실시하여 25/12/2009 날짜를 시도했으며 큰 오류가 발생했습니다 .Rails의 기본 날짜 형식 (ddmmyyyy가 필요함)

이 시점에서 저는 레일이 영국 스타일 대신 미국 날짜 모드 (mm/dd/yyyy)로 설정되었음을 알게되었습니다 : dd/mm/yyyy.

dd/mm/yyyy 형식으로 모든 날짜를 자동으로 처리하도록 레일을 설정하려면 어떻게해야합니까? 설정에서

+1

하지만 : 일/월/년 사방하지만 영국 – Pierre

답변

9

파일 : 설정/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

+0

이것은 매우 오래된 답변이며 Rails 4 또는 5에는 적용되지 않습니다. – danielricecodes

24

당신은 이제 변형 된 레일 @ 크리스 Ballance의 솔루션 노트를 사용하는 경우 s 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)

그냥 추가 (또는 변경) 변경할 수 있습니다 /en.yml :

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

명시 적으로 원하는 것을 수행하는 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

업데이트 국제화 ...

date: 
    formats: 
    default: "%m/%d/%Y" 
    short: "%b %d" 
    long: "%B %d, %Y" 
질문에 무관