On top of all those advantages, this approach totally avoids the issue of a certain country habitually writing down the month and the date the wrong way around.
From a frustratability perspective though, if your clients are people who use your system day in, day out because their business depends on it, you should probably consider them expert users, consider them willing to learn a particular date format so they can type it in a text box, because that's a helluva lot faster than picking your way through calendar boxes.
Ruby's Date class will parse from a wide variety of formats:
> Date.parse "december 15th, 1965" => Wed, 15 Dec 1965 > Date.parse "1st jan" => Sun, 01 Jan 2012 > Date.parse "1st jan 2038" => Fri, 01 Jan 2038 > Date.parse "1 jul 2000" => Sat, 01 Jul 2000 > Date.parse "jul 2nd 2000" => Sun, 02 Jul 2000 > Date.parse "27/2/2000" => Sun, 27 Feb 2000 > Date.parse "19-09-2009" => Sat, 19 Sep 2009
The only problem is when your users happen to be French. (Or German, or Swedish, or any of those crazy places that don't speak Ze English).
> Date.parse "19-fevrier-2013" => Thu, 19 Jan 2012 > Date.parse "19-mars-2013" => Tue, 19 Mar 2013 > Date.parse "19-avril-2013" => Thu, 19 Jan 2012
Something doesn't look right here. March works because (I suppose) Ruby looks at only the first three characters of the month token, so "mars" in French works out the same as "March" in English.
This is all a problem, because your expert users, impatiently bristling to get their hands on your finely-crafted app, are going to enter dates in a non-English language in a text field in a form on a web page that you are going to feed directly to an ActiveRecord object
def update @widget.update_attributes params[:widget] end
params[:widget][:expires] is "30 avr 2014" for example. Ouch.
Internally, ActiveRecord calls
Date._parse (as does
Date.parse which we've been looking at above, so you can guess what
ActiveRecord will do by looking at what
So, what you were really looking for was a patch for
Date._parse that will
automagically convert those foreigner month names so that stuff works as it should.
As it happens, I've written a little gist that you can take home with you and enjoy.
I keep it under
config/initializers/date.rb. It monkey-patches
gsub anything that might be a month, before
forwarding to the original Ruby implementation, only if the current locale is not
:en. It relies on translation strings that you provide via Rails' I18n
library. Specifically, it looks up
date.month_names to construct a map from $local_month_name to $month_name_in_english
that Ruby can deal with.