Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails中的默认日期格式(需要为ddmmyyyy)_Ruby On Rails - Fatal编程技术网

Ruby on rails Rails中的默认日期格式(需要为ddmmyyyy)

Ruby on rails Rails中的默认日期格式(需要为ddmmyyyy),ruby-on-rails,Ruby On Rails,我整天都在使用一个rails表单,我只是随机测试它,并尝试了日期为2009年12月25日,但它出现了一个巨大的错误 正是在这一点上,我意识到rails被设置为美式日期模式(mm/dd/yyyy),而不是英国样式:dd/mm/yyyy 如何设置rails以自动处理dd/mm/yyyy格式的所有日期?在您的设置文件中:config/environment.rb“ 资料来源: 您正在寻找类似的解决方案,尽管该解决方案仍然不太优雅 如果您使用的是@Chris Ballance的解决方案,请注意Rails

我整天都在使用一个rails表单,我只是随机测试它,并尝试了日期为2009年12月25日,但它出现了一个巨大的错误

正是在这一点上,我意识到rails被设置为美式日期模式(mm/dd/yyyy),而不是英国样式:dd/mm/yyyy


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

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

资料来源:
您正在寻找类似的解决方案,尽管该解决方案仍然不太优雅


如果您使用的是@Chris Ballance的解决方案,请注意Rails现在直接修改
Date
类,因此您将在解决方案中得到
未初始化的常量ActiveSupport
错误

见:

更新后的参数:

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

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

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

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

我通过添加名为mydatefield_格式化的getter和setter来解决这个问题,它们显式地做我想要的事情,并在任何地方使用它们。可能是一个购物清单,列出了不这样做的原因,但我非常喜欢它,所以我想把它留在这里

app/models/mymodel.rb

class Mymodel < ActiveRecord::Base
  include ValueFormatters
  add_value_formatters

  etc.
end
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
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
lib/general.rb

class Mymodel < ActiveRecord::Base
  include ValueFormatters
  add_value_formatters

  etc.
end
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
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
类概述
def self.parse_date(值,结束日期=false)
结果=零
开始
如果价值观存在?
如果value.length==8
结果=DateTime.strtime(值'%d/%m/%y')
如果result.year>Time.new.year+1
结果=DateTime.new(result.year-100,result.month,result.day)
结束
其他的
结果=DateTime.strtime(值'%d/%m/%Y')
结束
结束
救援异常=>e
#
结束
结果=结果+23.4小时+59.5分钟+59.5秒,如果结果为当天结束(&U)
结果
结束
def self.parse_datetime(值)
结果=零
开始
如果价值观存在?
结果=DateTime.strtime(值,'%d/%m/%Y%H:%m')
如果结果<100.5年前,结果=无
结束
救援异常=>e
#
结束
结果
结束
定义自身格式\u日期(值)
value.present??value.strftime(“%d/%m/%Y”):“”
结束
def self.format_datetime(值)
value.present??value.strftime(“%d/%m/%Y,在%H:%m”):“”
结束
def self.format_boolean(值,默认值=nil)
如果值==nil,则值=默认值
案例价值
如果是真的
“是的”
当错误
“不”
其他的
“未指明”
结束
结束
def self.parse_boolean(值,默认值=false)
case value.to_.downcase
什么时候是“真的”
什么时候“是”
当‘1’
什么时候“开”
真的
当“假”时
什么时候“不”
当“0”时
什么时候“关”
假的
其他的
违约
结束
结束
结束
更新的I18n

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

这只是处理输出…这不是他要问的。这是一个非常古老的答案,不适用于Rails 4或5。与问题无关,但:dd/mm/yyyy无处不在,除了美国风格,而不仅仅是英国的标准