Bug #13661
closedDateTime.parse parses strings with a month abbreviation after a word boundary as a valid date
Description
When parsing a string like "mark@gmail.com" it parses it into a DateTime i.e.:
require 'date'
DateTime.parse('mark@gmail.com')
#=> #<DateTime: 2017-03-01T00:00:00+00:00 ((2457814j,0s,0n),+0s,2299161j)>
It seems like https://github.com/ruby/ruby/blob/9c9c46e5a30fb47068337932eefde759b2763551/ext/date/date_parse.c#L1612 is the source of the issue. I think this might just require a slight tweak of the regex, it looks like things like "test.mark@gmail.com" work but not "testmark@gmail.com".
Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago
- Status changed from Open to Rejected
{Date,DateTime}.parse
use a loose parsing. They assume that somewhere in the string, there is something representing a date or time, and do their best to find it. Only if they can find nothing related to a date or time do they raise an exception.
In this case, mark@gmail.com
is parsed as the month March
:
DateTime._parse('mark@gmail.com')
# => {:mon=>3}
As no year or day is given, March 1 of the current year at midnight is used.
While this loose parsing is a fairly common compliant with the methods, it isn't a bug. As the documentation states: This method does not function as a validator.
You should not pass strings to {Date,DateTime}.parse
unless you think they contain a date.