Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Manejo de Fechas

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mar Nov 29, 2005 1:34 pm
kaeri
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2004
Mensajes: 53
Ubicación: México
Manejo de Fechas Responder citando

como puedo obtener la fecha de 3 dias más es decir si estamos a 29/11/2005 quisiera desplegar 02/12/2005. Question
Mensaje Mar Nov 29, 2005 1:40 pm
monoswim
Vive para Perl en Español
Vive para Perl en Español
Registrado: 18 Nov 2003
Mensajes: 716
Ubicación: Buenos Aires
Responder citando

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-Local-1.11/lib/Time/Local.pm

Espero que te sirva

Saludos
Mensaje Mar Nov 29, 2005 1:56 pm
kaeri
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2004
Mensajes: 53
Ubicación: México
con Add_Delta_Days Responder citando

con la siguiente modulo no se podria realizar??

Perl:
use Date::Calc qw(
        Add_Delta_Days
);
   

($year,$month,$day) = Add_Delta_Days($Syear,$Smon,$Sday,3);


Question
Mensaje Mar Nov 29, 2005 2:32 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Re: Manejo de Fechas Responder citando

kaeri escribió:
como puedo obtener la fecha de 3 dias más es decir si estamos a 29/11/2005 quisiera desplegar 02/12/2005. Question


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:

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,

Ultima edición por Perl user el Mar Nov 29, 2005 2:43 pm, editado 2 veces
Mensaje Mar Nov 29, 2005 2:39 pm
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

(Lo que sigue contempla el caso de que queramos pasar una fecha a otra, no a partir de la fecha actual)

Código:
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:
use Date::Simple qw(date);
$fecha = date("2000-02-28");
print $fecha + 1; # 2000-02-29
Realmente simple, una delicia.
Código:
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:
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:
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:
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:
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:
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.

Ultima edición por explorer39 el Mie Dic 07, 2005 1:43 pm, editado 3 veces
Mensaje Jue Dic 01, 2005 1:51 pm
kaeri
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2004
Mensajes: 53
Ubicación: México
Comparar fechas Responder citando

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?
Mensaje Jue Dic 01, 2005 2:14 pm
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

Yo no lo he probado, pero hay módulos específicos para interpretar fechas de postgres, como DateTime::Format::Pg:
Código:
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'.
Mensaje Vie Dic 02, 2005 10:34 am
kaeri
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2004
Mensajes: 53
Ubicación: México
comparar fechas Responder citando

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:

   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";
   }
Mensaje Vie Dic 02, 2005 11:25 am
explorer39
Perlero Frecuente
Perlero Frecuente
Registrado: 23 Ago 2005
Mensajes: 126
Ubicación: Valladolid, España
Responder citando

Código:
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:
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:
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";
}


Ultima edición por explorer39 el Vie Dic 02, 2005 11:50 am, editado 1 vez
Mensaje Vie Dic 02, 2005 11:42 am
kaeri
Perlero Nuevo
Perlero Nuevo
Registrado: 19 Ago 2004
Mensajes: 53
Ubicación: México
Gracias Responder citando

Ya quedo, muchisimas gracias
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group