• Publicidad

Fecha y Hora en UTC a tiempo local

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

Fecha y Hora en UTC a tiempo local

Notapor perleando_apenas » 2009-04-17 10:43 @488

Hola.
Estoy leyendo con Perl registros desde archivos cuyo primer campo es una fecha en formato: "yyyymmddHHMMssZ"

La fecha en cuestión es UTC y debo llevarla a hora local de acuerdo a la zona horaria que es un parámetro del programita.

Había pensado hacer algo así antes de comenzar a revisar:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
($seconds, $minutes, $hours_local, $day_of_month, $month, $year, $wday, $yday, $isdst) = localtime;

($seconds, $minutes, $hours_utc, $day_of_month, $month, $year, $wday, $yday, $isdst) = gmtime;

print "offset == ", $hours_local - $hours_utc, "\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Una vez con el offset podría leer cada registro y sumar el offset al campo fecha y tenerla en tiempo local. Sin embargo, creo que tiene errores básicos que no sé cómo solucionar:
1. ¿Será siempre el offset igual al localtime - UTC?
2. ¿Qué pasa si el offset es de horas y fracción? ¿funcionará?
3. ¿Existe alguna función que tome directamente la fecha UTC en formato yyyymmddHHMMssZ y la transforme en hora local (dándole la zona horaria como parámetro, por supuesto)?

Muchas gracias.
perleando_apenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2009-04-17 10:27 @477

Publicidad

Notapor explorer » 2009-04-17 16:20 @722

Bienvenido a los foros de Perl en Español, perleando_apenas.

Mientras que otros te darán soluciones con localtime, yo prefiero darte la solución con el módulo DateTime:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use DateTime;
use DateTime::Format::Strptime;

my $val = "20090103120001Z";

my $format = DateTime::Format::Strptime->new(
    pattern   => '%Y%m%d%H%M%SZ',
    time_zone => 'GMT',
);

my $date = $format->parse_datetime($val);
die "ERROR\n" if not $date;

print $date->strftime("%Y%m%d %H:%M %Z")."\n";  # Pintar hora en UTC
$date->set_time_zone("America/New_York");       # Cambio de zona
print $date->strftime("%Y%m%d %H:%M %Z")."\n";  # Pintar hora en zona
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Sale:
Código: Seleccionar todo
20090103 12:00 UTC
20090103 07:00 EST


El formato de la hora es muy parecido al formato ISO8601, pero le falta la letra 'T' entre la fecha y la hora.

En el caso de tener que interpretar fechas en formato ISO8601, entonces queda un pelín más cómodo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

use DateTime;
use DateTime::Format::ISO8601;

my $val = "20090103T120001Z";

my $date = DateTime::Format::ISO8601->parse_datetime( $val );
die "ERROR\n" if not $date;

print $date->strftime("%Y%m%d %H:%M %Z")."\n";  # Pintar hora en UTC
$date->set_time_zone("America/New_York");       # Cambio de zona
print $date->strftime("%Y%m%d %H:%M %Z")."\n";  # Pintar hora en zona
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

La familia de módulos DateTime suele ser muy útil para todo lo relacionado con fechas.

Otro ejemplo.
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

GRACIAS TOTALES!

Notapor perleando_apenas » 2009-04-20 09:28 @436

Explorer, agradezco enormemente tu ayuda.
¡¡Saludos!!
perleando_apenas
Perlero nuevo
Perlero nuevo
 
Mensajes: 20
Registrado: 2009-04-17 10:27 @477


Volver a Básico

¿Quién está conectado?

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