• Publicidad

Convertir fecha desde aaaa-mm-dd o dd-mm-aaaa

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Convertir fecha desde aaaa-mm-dd o dd-mm-aaaa

Notapor scout » 2009-11-23 16:48 @741

Gente: este aporte es de lo más básico pero me sirvió y seguramente os puede ayudar... si están comenzando en este maravilloso mundo de Perl... y les toca lidiar con fechas...

Previamente instalen Modern::Perl;

problema inicial: cuento con una variable pasada por el usuario en formato: aaaa-mm-dd
solución buscada: convertir dicha fecha en aaaammdd o ddmmaaaa

La solución utilizada fue...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Modern::Perl;
my $cadena = '2009-11-02T00:00:00';
my $fecha = substr $cadena, 0, 10;
my @fecha = split '-', $fecha;
my $fecha_nueva2 =$fecha[0]. $fecha[1]. $fecha[2];
print "\n";
print $fecha_nueva2;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Última edición por explorer el 2009-11-23 17:15 @760, editado 1 vez en total
Razón: Ortografía, bloques de código
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618

Publicidad

Re: Convertir fecha desde aaaa-mm-dd o dd-mm-aaaa

Notapor explorer » 2009-11-23 18:09 @797

Muchas gracias por el aporte, scout. Solo unas consideraciones...

¿Para qué necesitas usar el módulo Modern::Perl? No veo que estés usando ninguna característica nueva de Perl v5.10. Si acaso, activar el modo 'strict' y los 'warnings'.

En cuanto a la fecha, parece que $cadena está en formato ISO-8601, así que está en un formato estándar.

A veces es interesante pasar de ese formato a otro más compacto, porque no es necesaria tanta información. Por ejemplo, poner la fecha en el nombre de un fichero.

En cuanto a la forma de extraer la información de ese formato, deben existir muchas, ya que estamos hablando de una cadena de caracteres.

Si tu solución funciona, perfecto. ;)

En otros ambientes quizás se prefiera tener un control más férreo de la fecha que tenemos que tratar, porque, ¿realmente estamos seguros de que vamos a procesar siempre el mismo formato de fecha?

Como es normal, yo usaría la familia de módulos DateTime, que, para un problema pequeño, es algo excesivo, pero es necesario en cuanto el programa se va complicando.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use DateTime::Format::ISO8601;

my $cadena = '2009-11-02T00:00:00';

my $dt = DateTime::Format::ISO8601->parse_datetime( $cadena );
die "ERROR: Fecha no es correcta: [$cadena]\n" if !$dt;

print $dt->ymd(''), "\n"; # 20091102
print $dt->dmy(''), "\n"; # 02112009
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que no hay que hacer es hacérselas de listillo y resolverlo en una línea :twisted:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $cadena = '2009-11-02T00:00:00';

my $fecha  = join '', ($cadena =~ /(\d+)/g)[0..2];  # Buscamos los tres primeros valores numéricos

print "$fecha\n"; # 20091102
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

(salvo que documentemos lo que hacemos. En este caso, funciona de la siguiente manera:
  • Pasamos $cadena por una expresión regular, en la que buscamos, de forma repetitiva (/g), conjuntos de números (\d+), que son capturados por los paréntesis, y convertidos en una lista de valores
  • Como esa lista la tenemos encerrada entre paréntesis, es como si tuviéramos un arreglo. Así que ahora es lícito sacar de él, los 3 primeros valores ([0..2])
  • El resultado son tres valores, que son unidos con join() en un solo valor escalar.
)

Otra solución parecida a la tuya sería esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $cadena = '2009-11-02T00:00:00';

my $fecha  = join '', split '-', (split 'T', $cadena)[0];

print "$fecha\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

de cuya explicación queda como ejercicio para el lector :lol:

Y muchas más formas de resolverlo, que seguro que alguno de vosotros se le ocurre... pero recordad: si funciona, estupendo, pues eso es lo principal.

Perl nos brinda la capacidad de buscar múltiples soluciones o, mejor dicho, de hallar antes una solución. Incluso hasta de divertirnos con ella.

Por ejemplo, es la primera vez en mi vida que hago lo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#             01234567890
my $cadena = '2009-11-02T00:00:00';

substr($cadena, 4,1) = substr($cadena, 7,1) = substr($cadena,10) = '';

print "$cadena\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Lo mismo que antes, la explicación queda como ejercicio.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Convertir fecha desde aaaa-mm-dd o dd-mm-aaaa

Notapor scout » 2009-11-23 18:59 @833

jolínnnnnn... qué grande... tomaré nota...

Lo del módulo Modern::Perl, ya me di cuenta, pedazo de carteles me da el programa cuando lo activo...

Mi humilde solución salió de una conversión que tenía esa idea... y como buen scout la adapté y jugué con la misma... como cuando arreglo un ordenador me sobran tornillos, acá también me sobran módulos... jajaja trataré de ser más prolijo.
scout
Perlero nuevo
Perlero nuevo
 
Mensajes: 228
Registrado: 2009-10-28 13:50 @618


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados