Поскольку встроенные в Perl интерфейсы обработки дат выглядят неуклюже, и вам приходится передавать около полудюжины переменных, лучше использовать DateTime или Time :: Piece . DateTime - это поющий, все танцующий объект даты Perl, и вы, вероятно, в конечном итоге захотите его использовать, но Time :: Piece более прост и идеально подходит для этой задачи, имеет преимущество доставки с 5.10, а техника в основном то же самое для обоих.
Вот простой и гибкий способ использования Time :: Piece и strptime .
#!/usr/bin/perl
use 5.10.0;
use strict;
use warnings;
use Time::Piece;
# Read the date from the command line.
my $date = shift;
# Parse the date using strptime(), which uses strftime() formats.
my $time = Time::Piece->strptime($date, "%Y%m%d %H:%M");
# Here it is, parsed but still in GMT.
say $time->datetime;
# Create a localtime object for the same timestamp.
$time = localtime($time->epoch);
# And here it is localized.
say $time->datetime;
А вот способ для контраста.
Поскольку формат фиксирован, регулярное выражение будет работать нормально, но если формат изменится, вам придется настроить регулярное выражение.
my($year, $mon, $day, $hour, $min) =
$date =~ /^(\d{4}) (\d{2}) (\d{2})\ (\d{2}):(\d{2})$/x;
Затем преобразовать его в время эпохи Unix (секунды с 1 января 1970 г.)
use Time::Local;
# Note that all the internal Perl date handling functions take month
# from 0 and the year starting at 1900. Blame C (or blame Larry for
# parroting C).
my $time = timegm(0, $min, $hour, $day, $mon - 1, $year - 1900);
А потом вернемся к вашему местному времени.
(undef, $min, $hour, $day, $mon, $year) = localtime($time);
my $local_date = sprintf "%d%02d%02d %02d:%02d\n",
$year + 1900, $mon + 1, $day, $hour, $min;