Esta es la forma más sencilla de obtener el tiempo UNIX:
use Time::Local;
timelocal($second,$minute,$hour,$day,$month-1,$year);
Nota el orden inverso de los argumentos y que enero es el mes 0. Para muchas más opciones, vea el módulo de CPAN DateTime.
En cuanto al análisis sintáctico, vea el módulo Date::Parse de CPAN. Si realmente necesita hacerse elegante con el análisis de fecha, el Date::Manip puede ser útil, aunque su propia documentación lo advierte, ya que lleva una gran cantidad de equipaje (sabe cosas como feriados comerciales comunes, por ejemplo) y otras soluciones son mucho Más rápido.
Si sabe algo sobre el formato de las fechas/horas que analizará, una simple expresión regular puede ser suficiente, pero probablemente sea mejor utilizar un módulo de CPAN adecuado. Por ejemplo, si sabe que las fechas siempre estarán en orden YMDHMS, use el módulo CPAN DateTime::Format::ISO8601.
Por mi propia referencia, si no otra cosa, a continuación es una función que uso para una aplicación en la que sé las fechas estarán siempre en orden YMDHMS con la totalidad o parte de la parte "HMS" opcional. Acepta cualquier delimitador (p. Ej., "2009-02-15" o "2009.02.15"). Devuelve el tiempo Unix correspondiente (segundos desde 1970-01-01 00:00:00 GMT) o -1 si no pudo analizarlo (lo que significa que es mejor asegurarse de que nunca necesitará legítimamente analizar la fecha 1969- 12-31 23:59:59). También presume que los dos dígitos del año XX hasta "69" se refieren a "20XX", de lo contrario "19XX" (por ejemplo, "50-02-15" significa 2050-02-15 pero "75-02-15" significa 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;
}
Esta pregunta tiene extraños votos a favor – jdelator
advertencia obligatoria: Unix Epoch solo se define para los años 1901 - 2038. – Piskvor
@Piskvor: Eso no es estrictamente cierto. Y la época se define como el 1 de enero de 1970, no como un rango. Sin embargo, ese es el mejor rango que obtendrá para una marca de tiempo UNIX si lo representa en un entero de 32 bits (que es una convención generalizada). –