use strict; use warnings; use feature qw/ say state /; use DateTime::Format::Strptime; for ( ) { chomp; say sprintf '%-24s: %s', $_, validate( $_ ) ? 'OK' : 'Not OK'; } sub validate { state $parser = DateTime::Format::Strptime->new( pattern => '%F %T.%3N', on_error => 'croak', ); return eval { $parser->parse_datetime( @_ ); 1 }; } __DATA__ 2017-01-29 11:30:07.370 2017-01-29 11:30:07.000 2017-01-32 11:30:07.370 2017-01-29 11:30:07 foo bar #### my $str = '2017-01-29 11:30:07.370'; $parser = DateTime::Format::Strptime->new( pattern => '%F %T.%3N' ); if ( my $dt = $parser->parse_datetime( $str ) ) { say "Interestingly, $str falls on a " . $dt->day_name; } else { say "$str is not a valid date"; }