En este tutorial vamos a aprender como desplegar la fecha con Perl de manera sencilla y rápida.
time() y localtime()
En Perl podemos saber la hora del día usando la función time(), esta función regresa un número que si lo vemos es similar al siguiente:
1192320763
Este número representa la cantidad de segundos que han transcurrido desde una fecha en específico, en la mayoría de los sistemas esta fecha es el 1º de Enero de 1970 a las 0 horas GMT, una excepción de estos sistemas es la Mac, que cuenta los segundos desde el 1º de Enero de 1904 en la zona horaria del sistema.
A menos que tengamos la habilidad para hacer las fórmulas matemáticas en nuestro cerebro para convertir esos segundos en días, meses y años, realmente no nos ayuda de mucho, y para ello debemos de usar otra función de Perl que es localtime().
La función localtime recibe un número de tiempo similar al regresado por la función time() de Perl y convierte el número en una lista de 9 elementos.
# 0, 1, 2, 3, 4, 5, 6, 7, 8
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$sec(segundos), $min(minutos), y $hour(horas), representan la hora de la fecha especificada por time.
$mday es el día del mes y $mon es un número del 0 al 11 que representa el mes, donde 0 es Enero y 11 es Diciembre.
$year es la cantidad de años desde 1900 a la fecha. Así que para 2007 este elemento tendrá un valor de 107.
$wday es el día de la semana, representado con un número del 0 al 6, donde 0 es Domingo y 6 es Sábado.
$yday es el número del día del año, este número está en el rango del 0 al 364 y hasta 365 en años bisiestos.
Finalmente $isdst es verdadero en el caso de que la fecha esté dentro del horario de verano, también conocido como Daylight Saving Time, será falso de lo contrario.
Ya teniendo nuestros elementos entonces es simplemente cuestión de imprimirlos como nosotros querramos para sacar la fecha y hora actual:
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon++;
print "$mday/$mon/$year $hour:$min:$sec\n";
Primer recibimos nuestros 9 elementos de la fecha usando localtime().
Después sumamos 1900 al número que tenemos en $year, debido a que localtime() nos regresa la cantidad de años desde 1900.
En la cuarta línea sumamos uno al mes, pues recuerda que los meses los empieza a contar desde 0 y no de 1 como nosotros queremos.
Finalmente en la última línea imprimos la fecha y hora para que se vea de la siguiente manera:
13/10/2007 18:33:11
POSIX
Ya sabemos como imprimir la fecha, pero como todo en Perl, hay más de una manera de hacer las cosas, y de hecho hay una manera que es mucho más sencilla.
Todas las distribuciones de Perl vienen con módulos base, entre ellos POSIX. Este módulo contiene una función llamada strftime que nos permite darle formato a alguna fecha de manera sencilla.
Por ejemplo, para imprimir la fecha en el formato anterior, haríamos lo siguiente:
use POSIX qw/ strftime /;
print strftime( "%d/%m/%Y %H:%M:%S", localtime(time) );
En la primera línea cargamos el módulo POSIX con la función strftime para poder usarla en nuestro código.
Después, en la siguiente línea hacemos la llamada a la función e imprimimos el resultado.
Debemos enviar 10 argumento en total a strftime(), el primero es el formato en que queremos imprimir la fecha, y los otros nueve son todos aquellos elementos que nos regresa la función localtime. En este caso, simplemente hacemos una llamada a localtime que envía la lista a la función strftime.
Como ves es cuestión de un par de líneas desplegar la fecha como nosotros queremos, pero incluso podemos formatear la fecha de diversas maneras. Si ves, la cadena de formato está compuesta de varios símbolos de porcentaje seguidos de letras, estas expresiones serán sustiuidas por valores específicos por medio del POSIX, las posibles expresiones que podemos usar son:
%a | abreviación del día de la semana en inglés | Sun a Sat |
%A | día de la semana en inglés | Monday |
%b | mes abreviado en inglés | Jan a Dec |
%B | mes en inglés | January |
%c | fecha pre-formateada | ej. Fri Apr 28 17:23:15 1995 |
%d | día del mes | ej. 01-31 |
%H | hora del día | 00-23 |
%I | hora del día | 01-12 |
%j | día del año | 0-365 |
%m | mes del año | 01-12 |
%M | minuto | 00-59 |
%p | AM o PM | AM-PM |
%s | segundos | 00-59 |
%u | semana del año (Domingo como primer día) | 01-53 |
%w | día de la semana | 1 (Lunes) a 7 (Domingo) |
%W | semana del año (Lunes como primer día) | 01-53 |
%x | fecha formateada | ej. 04/28/95 |
%X | hora del día | ej. 03:30:01 AM |
%Y | año en 4 dígitos | ej. 2007 |
%Z | zona horaria | ej. Center Daylight Time |
El camino que tomes para desplegar la fecha en tu código depende de ti, pero mi recomendación es que uses POSIX pues te simplificará la vida.
En el siguiente tutorial veremos maneras más completas de desplegar la fecha en otros idiomas como el Español, usando unos módulos bastante sencillos.