use Time::Local; my $userdate = "Jan 12 2007"; my @months = qw (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); @monthname {@months} = 0 .. 11; my ($m, $day, $year) = split /\s+/, $userdate; defined $monthname {$m} or die "no valid month\n"; my $month = $monthname {$m}; for ($day, $year) { /^\d+$/ or die "$_ invalid\n" } my $timestamp = eval { local $SIG{__DIE__}; timelocal (0, 0, 0, $day, $month, $year) }; if ($@) { warn "invalid date: $@\n" } else { my @ltime = localtime ($timestamp); printf "date: %02d %s %04d\n", $ltime [3], $months [$ltime[4]], $ltime [5] + 1900; } print "done\n"; __END__