Foros del Web » Programación para mayores de 30 ;) » Programación General »

Sacar la fecha en perl

Estas en el tema de Sacar la fecha en perl en el foro de Programación General en Foros del Web. Pues eso, que cómo obtengo la fecha actual en un cgi en perl. saludos...
  #1 (permalink)  
Antiguo 19/07/2003, 08:18
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Sacar la fecha en perl

Pues eso,

que cómo obtengo la fecha actual en un cgi en perl.

saludos
  #2 (permalink)  
Antiguo 19/07/2003, 12:24
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 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.
  #3 (permalink)  
Antiguo 19/07/2003, 12:32
 
Fecha de Ingreso: mayo-2003
Mensajes: 328
Antigüedad: 21 años
Puntos: 0
Hola:

Veo que leonardop te respondió a tu pregunta con un código que funciona, pero creó que te puedo dar uno que aunque hace lo mismo es mucho más corto:

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

#ARRAY CON EL NOMBRE DE LOS DIAS EN CASTELLANO
    my @dias   = ('Domingo','Lunes','Martes','Miércoles',
               'Jueves','Viernes','Sábado');

#ARRAY CON EL NOMBRE DE LOS MESES EN CASTELLANO
    my @meses = ('Enero','Febrero','Marzo','Abril','Mayo','Junio','Julio',
                 'Agosto','Septiembre','Octubre','Noviembre','Diciembre');



    my ($segundo,$minuto,$hora,$dia,$mes,$anio,$diaSemana) = (localtime(time))[0,1,2,3,4,5,6];

    my $tiempo = sprintf("%02d:%02d:%02d",$hora,$minuto,$segundo);

    $anio += 1900;


    my $fecha = "$dias[$diaSemana] $dia de $meses[$mes]  del $anio $tiempo";

    print $fecha;
Saludos
  #4 (permalink)  
Antiguo 19/07/2003, 13:52
Avatar de tunait
Moderadora
 
Fecha de Ingreso: agosto-2001
Ubicación: Terok Nor
Mensajes: 16.805
Antigüedad: 22 años, 8 meses
Puntos: 381
Uff empezaba a creer que no encontraría la info nunca!

leonardop,

muchísimas gracias por las explicaciones, es justo lo que buscaba. No había encontrado el dato en ningún manual ni en los foros ni nada. Sabía que se tenía que poder, pues dudo mucho que las aplicaciones cgi en perl usen la hora del cliente. En serio que no encontré el dato en ningun lado

Había llegado hasta time() pero claro... salía lo que tenía que salir. Imaginaba que sería como el getTime() que también devuelve lo mismo. Pero localtime() no lo había visto en ninguna parte ni explicaciones en general de cómo manejar las fechas con perl.

Tienes razón en que debí poner "obtener" en vez de "sacar", me fijé al rato de ponerlo y pensé "luego lo cambio" y ahí se quedó sin cambiar.

El código que dejas con las explicaciones me va a servir mucho, ahora lo estudiaré con detenimiento (conste que yá lo he probado y releído varias veces, ahora lo voy a 'estudiar').
Te agradezco mucho

Kidd,

fenomenal el código más simplificado. También lo he probado y me va a venir estupendo para ver la forma de hacerlo de una forma más breve

Muchísimas gracias a ambos, os molestaré en mis próximas dudas

Saludos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:19.