• Publicidad

Comprobar fechas

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Comprobar fechas

Notapor jax2004 » 2010-08-21 09:59 @457

Buenas tardes, ¿alguien sabe de algún módulo que compruebe si una fecha introducida es correcta? Es decir, que no tenga 31 días un mes que solo puede tener 30, y ya si tiene la función de que febrero tenga solo 29 cuando es bisiesto...

Gracias.
jax2004
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-08-18 12:55 @580

Publicidad

Re: Comprobar fechas

Notapor explorer » 2010-08-21 10:07 @463

Pero... no nos has dicho en qué formato vas a leer la fecha... ¿ISO 8601? ¿día/mes/año? ¿otro?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comprobar fechas

Notapor jax2004 » 2010-08-21 11:03 @502

En principio la fecha la leo en formato yyyy/mm/dd pero no tengo problema en pasar la fecha a día, mes y año o cambiar el formato.
jax2004
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-08-18 12:55 @580

Re: Comprobar fechas

Notapor explorer » 2010-08-21 17:34 @773

Bueno, pues si en vez de las '/' hubieras usado los '-', entonces sí que serían auténticas fechas en formato ISO 8601, por lo que podrías haber usado el módulo DateTime::Format::ISO8601, así que en su lugar, usaremos uno más genérico, el DateTime::Format::Strptime:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use common::sense;
  3.  
  4. use DateTime::Format::Strptime;
  5.  
  6. my @fechas = qw(
  7.     2010-08-22
  8.     2009/02/29
  9.     2000/04/31
  10.     2000/02/29
  11.     2000/1/1
  12. );
  13.  
  14. my $parser = DateTime::Format::Strptime->new (
  15.     pattern     => '%Y/%m/%d',
  16.     locale      => 'es_ES',
  17.     time_zone   => 'Europe/Madrid',
  18. );
  19.  
  20. my $dt;
  21.  
  22. for my $fecha (@fechas) {
  23.  
  24.     $dt = $parser->parse_datetime( $fecha );
  25.  
  26.     say "$fecha : ", (($dt) ? 'es' : 'no es'), ' correcta';
  27. }
  28.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
sale:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
2010-08-22 : no es correcta
2009/02/29 : no es correcta
2000/04/31 : no es correcta
2000/02/29 : es correcta
2000/1/1 : es correcta
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Observa que la primera fecha no es correcta porque tiene guiones. Las dos siguientes no son correctas (no fue bisiesto el año pasado, ni abril tiene 31 días). Las siguientes sí son correctas.

Bueno, esta es una forma de hacerlo. Hay muchas más.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comprobar fechas

Notapor jax2004 » 2010-08-22 04:35 @232

explorer escribiste:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  say "$fecha : ", (($dt) ? 'es' : 'no es'), ' correcta';
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es justo lo que buscaba pero esta línea no la termino de entender. Por lo que he visto, say() es equivalente a print() con un salto de línea al final. Puesto que estoy haciendo un cgi no puedo utilizarlo. Luego lo que verdaderamente no sé que es, es lo de (($dt) ? 'es' : 'no es').
jax2004
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-08-18 12:55 @580

Re: Comprobar fechas

Notapor explorer » 2010-08-22 10:30 @479

El say() se utiliza a partir de la versión Perl v5.10. Te vale con poner un 'use 5.010;' al principio del programa, para hacer uso de él. Yo uso el módulo common::sense, que lo activa, además de otras características de lo que tiene que ser un Perl moderno.

La expresión (($dt) ? 'es' : 'no es') es un operador ternario (Operador condicional).

Lo que hace es lo siguiente: si $dt contiene un valor "verdadero", entonces la expresión devuelve la cadena 'es'. Si no, devuelve la cadena 'no es'.

Lo de "verdadero" se refiere a si la variable contiene un objeto DateTime o no. Si lo contiene, es que ha conseguido analizar la $fecha que le hemos pasado, y por lo tanto, es una fecha válida.

Con esto, además de validar la fecha, conseguimos tener la fecha convertida a objeto DateTime, con lo que podremos hacer muchas operaciones relacionadas con las fechas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comprobar fechas

Notapor jax2004 » 2010-08-22 15:16 @678

Gracias, yo no lo entendía ya que estoy acostumbrado al if-elsif-else y también al print().
jax2004
Perlero nuevo
Perlero nuevo
 
Mensajes: 7
Registrado: 2010-08-18 12:55 @580


Volver a Módulos

¿Quién está conectado?

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

cron