The documentation for ParseDate clearly explains the behavior (and even
the historical reason for it). From the docs for ParseDate:
===
This takes an array or a string containing a date and parses it. When
the date is included as an array (for example, the arguments to a
program) the array should contain a valid date in the first one or more
elements (elements after a valid date are ignored). Elements containing
a valid date are shifted from the array. The largest possible number of
elements which can be correctly interpreted as a valid date are always
used. If a string is entered rather than an array, that string is
tested for a valid date. The string is unmodified, even if passed in by
reference.
===
Given that this behavior is the original behavior and dates back more
than 15 years, I'm not going to change it at this point.
I realize that this may feel unintuitive to some, but it's actually a
feature that has some good uses. And it's easy to check whether the
entire arrary was parsed by looking to see if it's empty after the call.