Límites de fecha en timelocal de Perl

Una forma de validar una fecha en Perl es mediante la función timelocal del módulo Time::Local. El problemas es que en versiones de Perl menores a 5.12, las fechas que soporta están limitadas. En la documentación se indica “from Dec 1901 to Jan 2038”. Quise probar realmente estos límites y ahora les muestro un ejemplo práctico en Perl 5.8

Creamos un script con el siguiente código y lo llamamos test_timelocal.pl

#!/usr/bin/perl

use strict;

use Time::Local;

my ($fecha) = @ARGV;
$fecha =~ /^(\d{4})-(\d{2})-(\d{2})$/;
my ( $a, $m, $d ) = ($1,$2,$3);

my $time = undef;

eval {
      $time = timelocal(0,0,0,$d,--$m,$a); #se indica la cantidad de meses desde Enero (0..11)
};
if ( $@ ) { print "Fecha no definida"; }
else      { print $time; }

El mismo acepta como único parámetro una fecha. Obtendremos como resultado la cantidad de segundos desde el epoch del sistema.

Procedemos entonces a ejecutar desde la línea de comandos el script, intentando encontrar las fechas límite:

perl test_timelocal.pl 1901-12-16
-> Fecha no definida

perl test_timelocal.pl 1901-12-17
-> -2023488000

perl test_timelocal.pl 2038-01-16
-> 2147223600

perl test_timelocal.pl 2038-01-17
-> Fecha no definida

Comprobado empíricamente, en este caso las fechas soportadas por timelocal son aquellas que se encuentren en el rango desde 17/12/1901 al 16/01/2038, para versiones de Perl menores a 5.12

 

Basado en:

http://perldoc.perl.org/Time/Local.html#Limits-of-time_t

Tagged with: , , ,
Publicado en Aplicaciones