Página 1 de 1

Manejo de Fechas

NotaPublicado: 2005-11-29 14:34 @648
por kaeri
como puedo obtener la fecha de 3 dias más es decir si estamos a 29/11/2005 quisiera desplegar 02/12/2005. :?:

NotaPublicado: 2005-11-29 14:40 @652
por monoswim
Checkea el módulo TIme::Local

Pasa una fecha a segundos desde 1970 (como en unix) con eso le agregas los segundos que serían 3 días y con localtime() lo traes de nuevo a formato común...

http://search.cpan.org/~drolsky/Time-Lo ... e/Local.pm

Espero que te sirva

Saludos

con Add_Delta_Days

NotaPublicado: 2005-11-29 14:56 @664
por kaeri
con la siguiente modulo no se podria realizar??

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Date::Calc qw(
        Add_Delta_Days
);
   

($year,$month,$day) = Add_Delta_Days($Syear,$Smon,$Sday,3);
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


:?:

Re: Manejo de Fechas

NotaPublicado: 2005-11-29 15:32 @689
por Perl user
kaeri escribiste:como puedo obtener la fecha de 3 dias más es decir si estamos a 29/11/2005 quisiera desplegar 02/12/2005. :?:


Te recomiendo que utilices módulos del proyecto DateTime de Perl, los cuales están trabajandos profesionalmente, están actualmente mantenidos y tienen una interfaz limpia.

Código: Seleccionar todo
use DateTime;

my $dt = DateTime->now;
print $dt->add( days => 3 )->dmy( '/' ); # 'dd/mm/aaaa'


O en su defecto, para hacer algo mas "formal" puedes utilizar el operador '+' que está sobrecargado para jugar con objetos de fechas, intentando sumar un objeto DateTime con un DateTime::Duration, los resultados al final serán iguales.

Saludos,

NotaPublicado: 2005-11-29 15:39 @693
por explorer39
(Lo que sigue contempla el caso de que queramos pasar una fecha a otra, no a partir de la fecha actual)

Código: Seleccionar todo
use Date::Manip;
Date_Init( "Language=Spanish", "DateFormat=non-US" );
$fecha = DateCalc("29/11/2005", "+ 3 dias laborales");
print UnixDate($fecha,"%d/%m/%Y");
Este módulo está bien, pero no funcionará a menos que lo parcheéis según pongo aqui. Una vez hecho eso, es una delicia que te sume fechas, laborales o no.
Código: Seleccionar todo
use Date::Simple qw(date);
$fecha = date("2000-02-28");
print $fecha + 1; # 2000-02-29
Realmente simple, una delicia.
Código: Seleccionar todo
use DateTime::Format::ISO8601;
$iso = DateTime::Format::ISO8601->new;
$fecha = $iso->parse_datetime("20051129");
$fecha->add( days => 3 );
print $fecha->ymd("/");
Este es el que yo utilizo porque casi todos los ficheros que manejamos incorporan fechas en formato ISO8601. Puede parecer muy lioso de usar, pero hay que tener en cuenta que sólo hay que definir un objeto iso una sóla vez en el programa.
Código: Seleccionar todo
use DateTime;
$fecha =DateTime->new(
    year => 2005,
    month=> 11,
    day  => 29
);
print $fecha->add( days => 3 )->ymd("/");
Esta es la forma normal de trabajo que tengo con las fechas y necesito hacer operaciones con ellas. Es un poco lioso cuando se trata de hacer matemáticas con ellas, como por ejemplo saber la diferencia de tiempo entre dos fechas, pero bueno, para el resto, vale...
Código: Seleccionar todo
use Time::ParseDate;
use DateTime;
$fechaepoch = parsedate("29/11/2005", UK=>1, GMT=>1);
$fecha = DateTime->from_epoch(epoch=>$fechaepoch);
print $fecha->add(days=>3)->ymd("/");'
Y esta es la forma que uso si las fechas me vienen en el formato dia/mes/año.
Código: Seleccionar todo
use DateTime::Format::DateManip;
Date::Manip::Date_Init( "Language=Spanish", "DateFormat=non-US" );
my $dt = DateTime::Format::DateManip->parse_datetime( "29/11/2005" );
print $dt->add(days=>3)->ymd("/");
Esta versión es más compacta, porque usa DateManip y DateTime.
Código: Seleccionar todo
use DateTime::Format::Strptime;
my $Strp = new DateTime::Format::Strptime(
  pattern     => '%d/%m/%Y',
  locale      => 'es_ES',
  time_zone   => 'Europe/Madrid',
);
my $dt = $Strp->parse_datetime('29/11/2005');
print $dt->add(days=>3)->ymd("/"); # 2005/12/02
print $dt->month_name; # diciembre
Me parece demasiado prolijo... pero es la más flexible si la fecha se indica de otras formas, como por ejemplo:
Código: Seleccionar todo
use DateTime::Format::Strptime;
my $Strp = new DateTime::Format::Strptime(
  pattern     => '%d %B %Y',
  locale      => 'es_ES',
  time_zone   => 'Europe/Madrid',
);
my $dt = $Strp->parse_datetime('30 diciembre 2005');
print $dt->add(days=>3)->ymd("/"); # 2006/01/02

Estoy buscando formas más sencillas para interpretar fechas en Español. Date::Parse sólo trae soporte para Inglés, Francés, Alemán e Italiano. ¿Algún voluntario para hacer la parte de Español?

De todas formas, lo ideal es siempre usar las fechas en formato ISO8601 y los módulos DateTime.

Comparar fechas

NotaPublicado: 2005-12-01 14:51 @660
por kaeri
como puedo comparar fechas?

por ejemplo de una que esta capturada en una base de datos de postgres y una que yo obtengo de un formulario?

NotaPublicado: 2005-12-01 15:14 @676
por explorer39
Yo no lo he probado, pero hay módulos específicos para interpretar fechas de postgres, como DateTime::Format::Pg:
Código: Seleccionar todo
use DateTime::Format::Pg;
my $dt = DateTime::Format::Pg->parse_datetime( '2003-01-16 23:12:01' );

Luego dependerá del formato en que leas las fechas desde el formulario en la web.
Y luego, vete a DateTime y buscas por 'compare'.

comparar fechas

NotaPublicado: 2005-12-02 11:34 @523
por kaeri
Hola

Gracias por sus aportaciones

Ya no voy a comparar de una base de datos si no lo que tengo que hacer es comparar una fecha que introduzco desde un formulario, es decir que la fecha que se capture no debe ser menor a la del sistema mas 3 dias es decir

si estamos a 02/12/2005 + 3 dias = 05/12/2005 debe arrojarme un mensaje si selecciono el 04/12/2005 pues es un dia antes.

he estado probando y si me lo hace si selecicono fechas del mes de cicimebre pero si ya me voy al 2006 y selecciono 01/01/2006 me dice que es menor esta fecha.

Código: Seleccionar todo
   use DateTime;
   my $dt = DateTime->now;
   $fecha = $dt->add( days => 3 )->ymd;
   ($d,$m,$y)=split /-/,$in{'ff646'};
   ($year,$month,$day)=split /-/,$fecha;
   if ($d < $day and $m < $month and $y < $year){
     print "es menor la fech aintroducida";
   }

NotaPublicado: 2005-12-02 12:25 @559
por explorer39
Código: Seleccionar todo
use DateTime;

my %in = ( ff646 => '01-01-2006' );         # Formulario
my ($d,$m,$y)=split /-/,$in{'ff646'};       # Fecha del formulario

my $entrada = DateTime->new(                # Creamos nuevo objeto DateTime
  year => $y,                               # con la fecha del formulario
  month=> $m,
  day  => $d,
);

my $fecha = DateTime->today->add( days => 3 );# Hoy, mas 3 días

# Comparamos
if ( DateTime->compare( $entrada, $fecha ) < 0 ){
  print "es menor la fecha introducida";
}
Código: Seleccionar todo
use DateTime;
use Time::ParseDate;

my $entrada = parsedate('04-12-2005', UK=>1, GMT=>1);
   $entrada = DateTime->from_epoch(epoch=>$entrada);

my $fecha = DateTime->today->add( days => 3 );

if ( DateTime->compare( $entrada, $fecha ) < 0 ){
  print "es menor la fecha introducida";
}
Código: Seleccionar todo
use DateTime::Format::Strptime;
my $Strp = new DateTime::Format::Strptime(pattern=>'%d-%m-%Y');

my $entrada = $Strp->parse_datetime( '06-12-2005' ); # Formulario
my $fecha = DateTime->today->add( days => 3 );       # Hoy, mas 3 días
if ( DateTime->compare( $entrada, $fecha ) < 0 ){    # Comparación
  print "es menor la fecha introducida";
}

Gracias

NotaPublicado: 2005-12-02 12:42 @571
por kaeri
Ya quedo, muchisimas gracias