Perl - sumar fechas en perl

 
Vista:

sumar fechas en perl

Publicado por viaris (3 intervenciones) el 26/09/2005 15:28:33
Hola a todos,

Necesito hacer uan suma de fechas, tengo una fecha tal como 26-09-2005 (dd-mm-aa) y sumarle una cantidad de dias tal como 3 dias, lo que me deberia de dar como resultado 29-09-2005, sin embargo la unica forma de hacerla es controlando el mes y el ano, dado que si es al dia 30 al que le tengo que sumar dias, tengo que correr el mes y si el mes fuera diceimbre tendira que correr el ano.

Hay alguna funcion con la que no tenga que hacer mucha codigo?

Gracias?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:sumar fechas en perl

Publicado por Joaquin Ferrero (48 intervenciones) el 26/09/2005 18:54:45
Algo de código sí que tienes que hacer, pero con la ayuda de un par de módulos se puede arreglar...
Esta es una de las múltiples formas de resolverlo.

==========================================================
#!/usr/bin/perl

use Time::ParseDate;
use DateTime;

print "Introduce la fecha a cambiar: ";
my $fecha = <>
chomp($fecha);

my $segundos_desde_epoch = parsedate( $fecha, GMT => 1, UK => 1 );
my $dt = DateTime->from_epoch( epoch => $segundos_desde_epoch );

print "Fecha: $fecha. Nueva fecha: ", $dt->add(days=>3)->ymd, "\n";
==========================================================

Funciona bien...
latuv@modis:$ ./fecha.pl
Introduce la fecha a cambiar: 26/09/2005
Fecha: 26/09/2005. Nueva fecha: 2005-09-29

Incluso cuando el año es bisiesto:
latuv@modis:$ ./fecha.pl
Introduce la fecha a cambiar: 26/02/2000
Fecha: 26/02/2000. Nueva fecha: 2000-02-29
latuv@modis:$ ./fecha.pl
Introduce la fecha a cambiar: 27/02/2000
Fecha: 27/02/2000. Nueva fecha: 2000-03-01
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sumar fechas en perl

Publicado por Joaquin Ferrero (48 intervenciones) el 26/09/2005 19:02:31
Como este foro no maneja bien las marcas > , lo vuelvo a enviar, a ver si sale bien...

#!/usr/bin/perl
use Time::ParseDate;
use DateTime;

print "Introduce la fecha a cambiar: ";
my $fecha = <>
chomp($fecha);

my $segundos_desde_epoch = parsedate( $fecha, GMT => 1, UK => 1 );
my $dt = DateTime-> from_epoch( epoch => $segundos_desde_epoch );

print "Fecha: $fecha. Nueva fecha: ", $dt-> add(days=> 3)-> ymd, "\n";
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sumar fechas en perl

Publicado por Joaquin Ferrero (48 intervenciones) el 26/09/2005 20:40:08
Esta solución es más corta y espectacular (tiene en cuenta si los días son laborales o no).

============================================================
#!/usr/bin/perl
use Date::Manip;
print "Fecha: "; $fecha = <> ;
Date_Init("Language=Spanish","DateFormat=non-US");
print DateCalc( $fecha, "+ 3 dias",\$err,2 ), "\n";
============================================================
Si le paso 29/09/2005, sale 04/10/2005

Quitando el '2', entonces hace las cuentas de forma exacta, sin tener en cuanta si es laboral o no.

De todas formas prefiero usar más los módulos DateTime y dejar de usar el Date::Manip.

Curioso... acabo de descubrir que la versión 5.44 de Date::Manip tiene un bug que no permite usar la forma más directa:

DateCalc( $fecha, "+ 3 dias laborales");

Nada, nada... correo al autor...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sumar fechas en perl

Publicado por Viaris (3 intervenciones) el 28/09/2005 23:28:10
Gracias Joaquin funciona perfecto, instale el modulo de datatime e hice la prueba, ahora quieria a una fecha tipo timestamp sumarle horas, de tal forma si si la fecha es: 2005-09-28T21:19:44 y al sumarle 3 horas me deberia de dar 2005-09-29T01:19:44

Esto como se hace?

Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sumar fechas en perl

Publicado por Joaquin Ferrero (48 intervenciones) el 29/09/2005 12:24:05
Lo principal es usar los objetos DateTime siempre que se pueda.
En tu caso, lo primero es transformar la fecha a un objeto DateTime. Eso depende de en qué formato esté la fecha. Si por ejemplo la tienes dividida en campos, lo más cómodo es hacer un new:

use DateTime;
my $fecha = "2005-09-28T21:19:44";
my ($year,$mes,$dia,$hora,$minuto,$segundo) = $fecha =~ /(....)(..)(..)T(..):(..):(..)/;
my $fechadt = DateTime-> new(
year => 2005,
month => 9,
day => 28,
hour => 21,
minute => 19,
second => 44,
time_zone => 'UTC',
);

La zona horaria la eliges tu: UTC, local, GMT, o la de Nicaragua.

La otra forma es 'parseando' la fecha de forma directa, porque ya la tienes en formato ISO 8601:

use DateTime::Format::ISO8601;
my $fecha = "2005-09-28T21:19:44";
my $fechadt = DateTime::Format::ISO8601->parse_datetime( $fecha );

A partir del momento que tienes un objeto del tipo DateTime puedes hacer lo que quieras con el.
¿Que quieres sumarle 3 horas? Pues las sumas:

$fechadt-> add( hours => 3 );
print $fechadt-> ymd('-'),'T',$fechadt-> hms;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sumar fechas en perl

Publicado por viaris (3 intervenciones) el 29/09/2005 21:08:27
Hola, Gracias todo trabaja bien, ya entendi lo de la fechas.

Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sumar fechas en perl

Publicado por David C (2 intervenciones) el 17/10/2005 09:56:42
Hola:
He visto el hilo, y me parece muy interesante, hay mucho nivel por aqui :o .
Yo lo que quiero hacer es restar un dia a la fecha del sistema. Para ello queria basarme en el codigo que he visto en el hilo, pero cuando intento ejecutar cualquiera de los scripts me sale esto:

Can't locate Time/ParseDate.pm in @INC (@INC contains: /usr/lib/perl5/5.8.3/i586 -linux-thread-multi /usr/lib/perl5/5.8.3 /usr/lib/perl5/site_perl/5.8.3/i586-lin ux-thread-multi /usr/lib/perl5/site_perl/5.8.3 /usr/lib/perl5/site_perl /usr/lib /perl5/vendor_perl/5.8.3/i586-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8. 3 /usr/lib/perl5/vendor_perl .) at ./fechas.pl line 3.
BEGIN failed--compilation aborted at ./fechas.pl line 3.

¿Como le importo lo que le hace falta para funcionar?... muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:sumar fechas en perl

Publicado por Joaquin Ferrero (48 intervenciones) el 18/10/2005 12:29:36
El mensaje de error está diciendo que no encuentra el módulo Time::ParseDate. Debes ir a cpan (o alguno de sus mirror) e instalarlo. Si estás en linux, prueba a ejecutar el comando cpan. Y sino, como root, perl -MCPAN -e 'install Time::ParseDate'. O mejor aún dile a tu gestor de paquetes de software que lo instale.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar