我一直在使用rails表格整天工作,我只是隨機測試它,並嘗試日期25/12/2009,它提出了一個巨大的錯誤。Rails中的默認日期格式(需要爲ddmmyyyy)
正是在這一點上,我意識到,軌道設置爲美國日期模式(mm/dd/yyyy)而不是英國風格:dd/mm/yyyy。
如何設置導軌以自動處理dd/mm/yyyy格式的所有日期?
我一直在使用rails表格整天工作,我只是隨機測試它,並嘗試日期25/12/2009,它提出了一個巨大的錯誤。Rails中的默認日期格式(需要爲ddmmyyyy)
正是在這一點上,我意識到,軌道設置爲美國日期模式(mm/dd/yyyy)而不是英國風格:dd/mm/yyyy。
如何設置導軌以自動處理dd/mm/yyyy格式的所有日期?
在你的設置文件:到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
這只是處理輸出標準......這是不是他的什麼詢問。 – Subimage 2009-11-13 02:14:41
這是一個非常古老的答案,不適用於Rails 4或5。 – danielricecodes 2017-04-20 15:17:55
你正在尋找更多這樣的事情,雖然解決方案仍然不太優雅。
http://source.mihelac.org/2006/9/13/parsing-european-date-format-in-ruby-rails
如果您使用@克里斯巴蘭斯的解決方案需要注意的是,現在的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)
您可以更改使用日期格式國際化(i18n)
只需添加(或更改)這個在你的config /區域設置/en.yml:
en:
date:
order:
- :day
- :month
- :year
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
更新的I18n ...
date:
formats:
default: "%m/%d/%Y"
short: "%b %d"
long: "%B %d, %Y"
無關的問題,但:DD/MM/YYYY是無處不在,但美國的風格,不只是在英國 – Pierre 2012-08-02 23:27:25