in reply to Validate date value

You're using timelocal already... good. Now you just have to check, after conversion of $dummy (which is an epoch time in seconds) back to date/time components, with localtime, whether you end up with the same day of the month. If not, it must have wrapped to the next month.
eval { my $dummy = timelocal($sec,$min,$hour,$mday,$mon,$year); die "Day out of range" unless (localtime($dummy))[3] == $mday; };

Note that you also got accepted dates for the 31st of all other short months than just February: April, June, September, November. Now they'll all be caught.