• Publicidad

Fecha con mi formato

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

Fecha con mi formato

Notapor rfm » 2009-11-10 15:14 @676

Hola a todos.

Tengo un problemilla al obtener el mes en la llamada al sistema "date" de esta forma.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %meses=(   ......
           'noviembre' => "Noviembre",
           'diciembre' => "Diciembre",
           );
my $timestamp=`date "+%d de $meses{%B} del %Y"`;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


No me muestra el mes en mi formato cuando hago print "$timestamp"...
Sin embargo sí que lo muestra si no hago referencia al hash...

Muchas gracias por adelantado.
Un saludo.
rfm
Perlero nuevo
Perlero nuevo
 
Mensajes: 47
Registrado: 2007-11-09 09:00 @417

Publicidad

Re: Fecha con mi formato

Notapor erv-Z » 2009-11-10 16:08 @713

Buenaas, tu problema era que al inicio del hash ponías unos puntos suspensivos; así queda el código arreglado.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %meses=(
'noviembre' => "Noviembre",
'diciembre' => "Diciembre",
);
my $timestamp=`date "+%d de $meses{%B} del %Y"`;

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


No te tirará el mes porque estás llamando un elemento que no existe en el hash %meses; se arreglaría así.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %meses=(
'noviembre' => "Noviembre",
'diciembre' => "Diciembre",
);
my $timestamp=`date "+%d de %B del %Y"`;

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


Y si quieres llamar algún elemento del hash %meses se llamaría así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %meses=(
'noviembre' => "Noviembre",
'diciembre' => "Diciembre",
);
my $timestamp=`date "+%d de $meses{noviembre} del %Y"`;

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


Ahí estoy llamando el elemento existente que es noviembre del hash %meses.

Saludos.
erv-Z
Perlero nuevo
Perlero nuevo
 
Mensajes: 158
Registrado: 2009-07-25 13:00 @583

Re: Fecha con mi formato

Notapor rfm » 2009-11-10 16:26 @726

Gracias por responder erv-z.

Lo de los puntos suspensivos estaba así aposta: era por no poner todos los valores :)

Respecto a lo de llamar al valor del hash, si llamo literalmente a $meses{noviembre} efectivamente me lo muestra bien, pero la gracia de todo esto es que me sustituya el %B del "date" dentro del hash %meses.

He probado a hacerlo en 2 líneas y se ejecuta bien de esta forma:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %meses=(
           "noviembre" => "Noviembre",
           "diciembre" => "Diciembre",
           );
my $mes=`date +%B`;
chop($mes);
$mes = $meses{$mes};

my $fecha=`date "+%d de $meses{$mes} de %Y"`;
$fecha=~ s/[\n\r]//g;
print "$fecha\n"
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
;

Pero sigo buscando la manera de hacerlo llamando una única vez a la llamada al sistema "date".

Un saludo.
rfm
Perlero nuevo
Perlero nuevo
 
Mensajes: 47
Registrado: 2007-11-09 09:00 @417

Re: Fecha con mi formato

Notapor rfm » 2009-11-10 16:34 @731

Perdón. Rectifico el código anterior...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %meses=(
           "noviembre" => "Noviembre",
           "diciembre" => "Diciembre",
           );
my $mes=`date +%B`;
chop($mes);
$mes=$meses{$mes};

my $fecha=`date "+%d de $mes de %Y"`;
$fecha=~ s/[\n\r]//g;
print "$fecha\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
rfm
Perlero nuevo
Perlero nuevo
 
Mensajes: 47
Registrado: 2007-11-09 09:00 @417

Re: Fecha con mi formato

Notapor explorer » 2009-11-10 17:52 @786

rfm, recuerda que puedes reeditar tus propios mensajes: en cada mensaje aparece un botón para editarlo. Así no tienes que escribir un nuevo mensaje, como este último que has mandado.

Sobre el problema, yo lo que haría sería no usar ningún comando date del sistema.

Perl tiene sus propias funciones de tiempo:
* time() devuelve el número de segundos desde el 1970/01/01, así que con ella tenemos una medida del tiempo
* localtime(). Devuelve la fecha en la zona horaria del sistema. Por defecto, toma la fecha devuelta por time(), así que devuelve la fecha actual.
* Hay otra variante de localtime(), que es gmtime(), que devuelve la fecha referida a GMT.

Podemos probar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print scalar localtime;  # Tue Nov 10 23:17:21 2009
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


localtime(), en modo escalar, devuelve una cadena de caracteres, con la fecha actual formateada en estilo ctime (ver man 3 ctime). No se puede cambiar el formato.

Hay otra forma de sacar fechas: con el uso del módulo POSIX:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use POSIX qw(strftime);

$ahora = strftime '%A %B %e %H:%M:%S %Y', localtime;

print $ahora, "\n";  # martes noviembre 10 23:22:25 2009
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y ya tenemos la salida de la fecha como queremos. ¡Ojo! La fecha sale en Español porque en mi sistema lo tengo definido así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
explorer@casa:~/Documents/Desarrollo> locale
LANG=es_ES.UTF-8
LC_CTYPE="es_ES.UTF-8"
LC_NUMERIC="es_ES.UTF-8"
LC_TIME="es_ES.UTF-8"
LC_COLLATE="es_ES.UTF-8"
LC_MONETARY="es_ES.UTF-8"
LC_MESSAGES="es_ES.UTF-8"
LC_PAPER="es_ES.UTF-8"
LC_NAME="es_ES.UTF-8"
LC_ADDRESS="es_ES.UTF-8"
LC_TELEPHONE="es_ES.UTF-8"
LC_MEASUREMENT="es_ES.UTF-8"
LC_IDENTIFICATION="es_ES.UTF-8"
LC_ALL=
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Podemos incluso hacer que salga en el idioma que queramos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use POSIX qw(strftime locale_h);

setlocale(LC_TIME, 'fr_CA');   # Ahora somos canadienses francófonos, pero solo en las fechas

my $ahora = strftime '%A %B %e %H:%M:%S %Y', localtime;

print $ahora, "\n";  # mardi novembre 10 23:29:20 2009
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Eso sí, en el sistema debe estar instaladas las localizaciones que deseemos usar.

A propósito... en Español, los nombres de las estaciones, los meses y días de la semana, cuando no son nombres propios o fechas históricas, :arrow: NO se ponen en mayúscula :!: (ver el Diccionario Panhispánico de Dudas, sección 6.1).

Si aún así quieres ponerlo en mayúscula, Perl cuenta con una función para ese tema: ucfirst(), con lo que tu programa se quedaría así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use POSIX qw(strftime);

my $mes = ucfirst strftime '%B', localtime;

print $mes, "\n";      # Noviembre
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Pero si lo haces, recuerda que solo tú serás el responsable. ;)

En fin, hoy en día, lo recomendable para cualquier cosa que tenga que ver con el tiempo, es usar el módulo DateTime:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use DateTime;

my $ahora = DateTime->now(locale => 'es_ES');

print $ahora->month_name(),               "\n"; # noviembre
print $ahora->strftime('%d de %B de %Y'), "\n"; # 10 de noviembre de 2009
print $ahora,                             "\n"; # 2009-11-11T13:40:32
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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: Fecha con mi formato

Notapor rfm » 2009-11-11 03:28 @186

Ok. Gracias por la ayuda, explorer.
rfm
Perlero nuevo
Perlero nuevo
 
Mensajes: 47
Registrado: 2007-11-09 09:00 @417


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 12 invitados

cron