• Publicidad

Manejo de Fechas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Manejo de Fechas

Notapor kaeri » 2005-11-29 14:34 @648

como puedo obtener la fecha de 3 dias más es decir si estamos a 29/11/2005 quisiera desplegar 02/12/2005. :?:
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Publicidad

Notapor monoswim » 2005-11-29 14:40 @652

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
MonoSwim
Perl Programming Language
Avatar de Usuario
monoswim
Perlero nuevo
Perlero nuevo
 
Mensajes: 452
Registrado: 2003-11-18 16:13 @717
Ubicación: Buenos Aires

con Add_Delta_Days

Notapor kaeri » 2005-11-29 14:56 @664

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


:?:
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Re: Manejo de Fechas

Notapor Perl user » 2005-11-29 15:32 @689

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,
Última edición por Perl user el 2005-11-29 15:43 @697, editado 2 veces en total
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Notapor explorer39 » 2005-11-29 15:39 @693

(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.
Última edición por explorer39 el 2005-12-07 14:43 @654, editado 3 veces en total
explorer39
 

Comparar fechas

Notapor kaeri » 2005-12-01 14:51 @660

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?
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Notapor explorer39 » 2005-12-01 15:14 @676

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'.
explorer39
 

comparar fechas

Notapor kaeri » 2005-12-02 11:34 @523

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";
   }
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México

Notapor explorer39 » 2005-12-02 12:25 @559

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";
}
Última edición por explorer39 el 2005-12-02 12:50 @576, editado 1 vez en total
explorer39
 

Gracias

Notapor kaeri » 2005-12-02 12:42 @571

Ya quedo, muchisimas gracias
Avatar de Usuario
kaeri
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2004-08-19 12:05 @545
Ubicación: México


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron