If a block is given, the year described in date is converted
by the block. For example:

Time.parse(...) {|y| y < 100 ? (y >= 69 ? y + 1900 : y + 2000) : y}

If the upper components of the given time are broken or missing, they are
supplied with those of now. For the lower components, the
minimum values (1 or 0) are assumed if broken or missing. For example:

Since there are numerous conflicts among locally defined timezone
abbreviations all over the world, this method is not made to understand all
of them. For example, the abbreviation “CST” is used variously as:

-06:00 in America/Chicago,
-05:00 in America/Havana,
+08:00 in Asia/Harbin,
+09:30 in Australia/Darwin,
+10:30 in Australia/Adelaide,
etc.

Based on the fact, this method only understands the timezone abbreviations
described in RFC 822 and the system timezone, in the order named. (i.e. a
definition in RFC 822 overrides the system timezone definition.) The
system timezone is taken from Time.local(year, 1, 1).zone and
Time.local(year, 7, 1).zone. If the extracted timezone
abbreviation does not match any of them, it is ignored and the given time
is regarded as a local time.