use Time::Local; my ($sec,$min,$hour) = qw( 0 0 12 ); my ($mday, $mon, $year) = qw(31 02 2012); $mon--; # because that's how unix/C treat the month value eval { my $dummy = timelocal($sec,$min,$hour,$mday,$mon,$year); }; print $@; if (my $err = $@) { print "This is an invalid date."; } else { print "Yay"; };