Это самый простой способ получить время Unix:
use Time::Local;
timelocal($second,$minute,$hour,$day,$month-1,$year);
Обратите внимание на обратный порядок аргументов, и что январь - месяц 0.
Дополнительные параметры см. В модуле DateTime из CPAN.
Что касается синтаксического анализа, см. Модуль Date :: Parse из CPAN. Если вам действительно нужно разбираться с парсингом дат, Date :: Manip может быть полезен, хотя его собственная документация предупреждает вас об этом, поскольку он несет много багажа (он знает такие вещи, как обычные деловые каникулы). например) и другие решения гораздо быстрее.
Если вам что-то известно о формате даты / времени, которое вы будете анализировать, тогда может быть достаточно простого регулярного выражения, но вам, вероятно, лучше использовать соответствующий модуль CPAN. Например, если вы знаете, что даты всегда будут в порядке YMDHMS, используйте модуль CPAN DateTime :: Format :: ISO8601 .
Для справки, если не сказать ничего другого, ниже приведена функция, которую я использую для приложения, в котором, как я знаю, даты всегда будут в порядке YMDHMS, причем часть или часть HMS необязательна. Он принимает любые разделители (например, «2009-02-15» или «2009.02.15»). Он возвращает соответствующее время Unix (в секундах с 1970-01-01 00:00:00 по Гринвичу) или -1, если он не может его проанализировать (что означает, что вам лучше быть уверенным, что вам никогда не понадобится законно анализировать дату 1969- 12-31 23:59:59). Это также предполагает двузначные годы XX до «69», относящиеся к «20XX», в противном случае «19XX» (например, «50-02-15» означает 2050-02-15, но «75-02-15» означает 1975- 02-15).
use Time::Local;
sub parsedate {
my($s) = @_;
my($year, $month, $day, $hour, $minute, $second);
if($s =~ m{^\s*(\d{1,4})\W*0*(\d{1,2})\W*0*(\d{1,2})\W*0*
(\d{0,2})\W*0*(\d{0,2})\W*0*(\d{0,2})}x) {
$year = $1; $month = $2; $day = $3;
$hour = $4; $minute = $5; $second = $6;
$hour |= 0; $minute |= 0; $second |= 0; # defaults.
$year = ($year<100 ? ($year<70 ? 2000+$year : 1900+$year) : $year);
return timelocal($second,$minute,$hour,$day,$month-1,$year);
}
return -1;
}