Ver Mensaje Individual
  #2 (permalink)  
Antiguo 19/07/2003, 12:24
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 21 años, 8 meses
Puntos: 1
Hola,

Bueno, me parece que quizás la pregunta correcta es, ¿cómo obtener la fecha en Perl? El hecho de que vayas a usar tal recurso en una aplicación orientada a CGI es secundario. No es nada importante, es sólo una observación. :)

Ahora bien, sobre la cuestión de la fecha... Perl dispone de algunas funciones útiles en este sentido:

* time() - Retorna la fecha y hora actual del sistema en formato "UNIX timestamp", el cual consiste básicamente de la cantidad de segundos transcurridos desde el comienzo del 1 de Enero de 1970 hasta determinado momento.

* localtime() - Dado que en muchas ocasiones el formato UNIX timestamp no es muy apropiado para algunas cosas, localtime resulta útil para "humanizarlo". Esta función recibe una fecha/hora en formato UNIX timestamp y retorna una lista de 9 valores más cómodos que corresponden a la fecha/hora recibida. En orden, los valores que retorna son:

- segundos
- minutos
- horas
- dia del mes
- mes
- año
- día de la semana
- día del año
- un valor falso/verdadero que indica si el tiempo especificado ocurre durante el día a no.

Ahora viene lo bueno... ¿En qué formato deseas tener el dato de la fecha? Puede que quieras contar con algo como "DD/MM/YY", "YYYY-MM-DD", "MM-DD-YYYY HH:MM, etc. Aquí viene a jugar lo que hagas con la información que retorna localtime().

A continuación te presento un ejemplo del manejo de fechas/horas en Perl:

Código:
#! /usr/bin/perl -w

use strict;

use vars qw($segundos $minutos $horas
            $dia_mes $mes $anyo $dia_semana
            $dd $mm $yy $yyyy
            $HH $MM $am_pm
            $dia_semana_castellano $mes_castellano
            $fecha_unix);


### Aqui empieza el codigo interesante ###


$fecha_unix = time ();  # Comenzamos obteniendo la fecha/hora actual


# Ahora le pedimos a localtime() que nos ayude a procesar la fecha,
# para contar con valores mas comodos. Los campos que esta funcion
# retorna y no necesitamos podemos ignorarlos. En este caso `undef'
# permite hacer tal cosa.

($segundos, $minutos, $horas,
 $dia_mes, $mes, $anyo, $dia_semana,
 undef, undef) = localtime ($fecha_unix);


# Ahora realizamos algunos procesamientos propios... Todo depende de
# como queremos disponer de la fecha/hora.

# Primero tomemos los valores de dia y mes, asegurando que cuenten con
# dos digitos.

$dd = $dia_mes < 10 ? '0' . $dia_mes : $dia_mes;

$mm = $mes < 10 ? '0' . $mes : $mes;

if ($anyo < 1900)
    { $anyo += 1900 }  # Con el proposito de evitar el `bug' del milenio

$yy = substr ($anyo, 2, 2);


# Ahora produzcamos tambien otros formatos para las horas

$MM = $minutos < 10 ? '0' . $minutos : $minutos;

if ($horas > 12) {
    $HH = $horas - 12 < 10 ? '0' . ($horas - 12) : $horas - 12;
    $am_pm = 'PM';
} else {
    $HH = $horas < 10 ? '0' . $horas : $horas;
    $am_pm = 'pm';
}


# Finalmente, vamos a preparar un formato personalizado, y en este
# caso, "castellanizado". Es posible, para este proposito, utilizar
# ciertas funciones que dependen de la forma en que se encuentre
# configurado el sistema. Sin embargo, estas por obvias razones pueden
# producir resultados diferentes en maquinas diferentes; asi que
# preferiremos implementar nuestra propia solucion.

for ($dia_semana) {
    /^0$/ && do { $dia_semana_castellano = 'Domingo';   last; };
    /^1$/ && do { $dia_semana_castellano = 'Lunes';     last; };
    /^2$/ && do { $dia_semana_castellano = 'Martes';    last; };
    /^3$/ && do { $dia_semana_castellano = 'Miercoles'; last; };
    /^4$/ && do { $dia_semana_castellano = 'Jueves';    last; };
    /^5$/ && do { $dia_semana_castellano = 'Viernes';   last; };
    /^6$/ && do { $dia_semana_castellano = 'Sabado';    last; };
}

for ($mes) {
    /^1$/  && do { $mes_castellano = 'Enero';      last; };
    /^2$/  && do { $mes_castellano = 'Febrero';    last; };
    /^3$/  && do { $mes_castellano = 'Marzo';      last; };
    /^4$/  && do { $mes_castellano = 'Abril';      last; };
    /^5$/  && do { $mes_castellano = 'Mayo';       last; };
    /^6$/  && do { $mes_castellano = 'Junio';      last; };
    /^7$/  && do { $mes_castellano = 'Julio';      last; };
    /^8$/  && do { $mes_castellano = 'Agosto';     last; };
    /^9$/  && do { $mes_castellano = 'Septiembre'; last; };
    /^10$/ && do { $mes_castellano = 'Octubre';    last; };
    /^11$/ && do { $mes_castellano = 'Noviembre';  last; };
    /^12$/ && do { $mes_castellano = 'Diciembre';  last; };
}


# Ahora vamos a mostrar la fecha, en algunos formatos comunes.

print "\nEn este momento, la fecha/hora del sistema es la siguiente:\n\n";

print "  UNIX timestamp : $fecha_unix\n";
print "  D-M-Y H:M:S    : $dia_mes-$mes-$anyo $horas:$minutos:$segundos\n";
print "  DD/MM/YY       : $dd/$mm/$yy\n";
print "  Personalizado  : $dia_semana_castellano $dia_mes " .
    "de $mes_castellano, $anyo $HH:$MM $am_pm\n";

Espero que pueda servirte como guía para tu propia aplicación. En mi sistema, al ejecutar este programa, produce la siguiente salida:

Código:
$ perl fechas.pl 

En este momento, la fecha/hora del sistema es la siguiente:

  UNIX timestamp : 1058638607
  D-M-Y H:M:S    : 19-6-2003 13:16:47
  DD/MM/YY       : 19/06/03
  Personalizado  : Sabado 19 de Junio, 2003 01:16 PM
Nota que es un programa corriente escrito en Perl. Si quisieras adaptarlo a un entorno CGI, puedes utilizar el código a partir de la línea que reza "Aqui empieza el codigo interesante". Y si deseas que la salida aparezca en una página web, probablemente querrás añadir unas cuantas etiquetas <br />.

Un cordial saludo.