I've run into a spot of bother with date formats in our Rails application.
I have a date field in our view wh开发者_JAVA百科ich I want to be formatted as dd/mm/yy. This is how the user will expect to enter their dates, and the datepicker control uses this format.
However, Active Record seems to be expecting mm/dd/yy.
If I enter 01/03/2010, this gets put in as 03 January 2010.
If I enter 25/03/2010, this gets put in a null.
How do I get ActiveRecord to expect Her Majesties date format?
Rails' DateTime tries to detect the formatting automatically. It will detect the following formats: mm/dd/yy
or dd-mm-yy
or yyyy-mm-dd
or yyyy/mm/dd
. You could monkey-patch DateTime.parse
, but I would rather move this issue to the View of your application.
I always recommend to use yyyy-mm-dd [hh:mm:ss]
as a string representation for a date. Check the documentation of your DatePicker if it supports multiple date-formats.
The jQuery date-picker for example has this covered with dateFormat
(for the data that is sent to the server, set this to yyyy-mm-dd
) as well as altFormat
(for the input the user sees, set this to dd/mm/yyyy
).
Add a file called rails_defaults.rb
to config\initializers
directory; with following lines:
Date::DATE_FORMATS[:default] = '%d/%m/%Y'
Time::DATE_FORMATS[:default]= '%d/%m/%Y %H:%M:%S'
Restart the server and you are good to go.
class Date
class << self
def _parse_with_us_format(date, *args)
if date =~ %r{^(\d+)/(\d+)/(\d+)$}
_parse_without_us_format("#{$3.length == 2 ? "20#{$3}" : $3}-#{$1}-#{$2}", *args)
else
_parse_without_us_format(date, *args)
end
end
alias_method_chain :_parse, :us_format
end
end
精彩评论