• Publicidad

Suma de fechas

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Re: Suma de fechas

Notapor piero66 » 2013-11-14 10:24 @475

Ya lo probé y ahora sí ya quedó. Muchas gracias y, en efecto, sólo quité esta parte:

# "EraseHolidays=1"

ya que me traje la línea desde la antigua versión ¡¡ y supongo en la nueva cambia !!

¡¡ Muchas gracias de nuevo !!
piero66
Perlero nuevo
Perlero nuevo
 
Mensajes: 95
Registrado: 2008-05-22 12:00 @541

Publicidad

Ayuda con Date::Manip Zona Horaria

Notapor Chascarrilla » 2014-04-14 14:23 @641

Hola.

He visitado varios foros donde hablan de calcular fechas y tener en cuenta los festivos. Sin embargo tengo un problema con la librería "Date::Manip". No sé si estoy haciendo algo mal, pero cuando coloco el ejemplo:

#!c:/perl/bin/perl.exe
use Date::Manip;

Date_Init( "DateFormat=non-US", "EraseHolidays=1");

$diferencia = DateCalc("10/07/2006", "18/07/2006", 2); # 2: modo 'business'
$dias = Delta_Format($diferencia,1,"%dt"); # pasar a días
print $dias;

Me genera el siguiente error:

ERROR: Date::Manip unable to determine Time Zone.
at C:/APL/IBM/RationalSDLC/common/lib/perl5/5.8.6/Date/Manip/DM5.pm line 3564
Date::Manip::DM5::Date_TimeZone() called at C:/APL/IBM/RationalSDLC/common/lib/perl5/5.8.6/Date/Manip/DM5.pm line 577
Date::Manip::DM5::Date_Init('DateFormat=non-US', 'EraseHolidays=1') called at C:/PERL/TEST.pl line 4

Descargue la librería del enlace http://search.cpan.org/~sbeck/Date-Mani ... /Manip.pod

Cuando busco la línea (DM5.pm line 3564) dice confess "ERROR: Date::Manip unable to determine Time Zone.\n";
En la línea (DM5.pm line 577) dice $Cnf{"TZ"}=Date_TimeZone();


No sé cómo definir la variable para la Zona horaria. ¡¡¡¡Agradezco si me pueden ayudar!!!!

Gracias.
Avatar de Usuario
Chascarrilla
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2012-07-19 10:01 @459

Re: Suma de fechas

Notapor explorer » 2014-04-14 17:10 @757

Según la sección KNOWN PROBLEMS OR ISSUES de la página de manual Date::Manip::TZ, ese error indica que el módulo no ha podido identificar cuál es la zona horaria en la que se está trabajando. La solución primera que comentan es recomendar el paso a la versión 6 de Date::Manip (en el mensaje de error veo que sale DM5.pm, así que estás trabajando con la versión 5).

En ese mismo documento está la sección DETERMINING THE SYSTEM TIME ZONE, donde cuentan cómo calcula el módulo en qué zona horario se encuentra. Vemos que estás en Windows, así que utiliza varios métodos para intentar averiguarlo. Pero falla, lo cual es sorprendente, porque incluso consulta el Registro de Windows.

Estás en un Windows muy raro, o con excesivas prohibiciones de acceso a la información del sistema (políticas de acceso).

Entonces... lo más cómodo será que le indiques tú cuál es esa zona, en el Date_Init. Ejemplo, para mi caso sería:

Date_Init( "DateFormat=non-US", "EraseHolidays=1", "TZ=MESZ");

'MESZ' corresponde al horario de verano de centroeuropa (GMT +02:00). Tendrás que consultar la tabla de la sección TIME ZONES de Date::Manip::DM5. También puedes indicarlo de otras maneras: +02:00, Europe/Madrid, etc.
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: Suma de fechas

Notapor Chascarrilla » 2014-04-15 17:19 @763

Hola, explorer.

Muchas gracias por tu ayuda, verificando el DM5.pm, cuando está identificando la zona horaria toma la del sistema...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  # Now parse each one to find the first valid one.
  foreach $tz (@tz) {
      "Codigo...." }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sin embargo cuando sale del foreach() está colocando el error (confess "ERROR: Date::Manip unable to determine Time Zone.\n";)
así que nunca va a enviar la zona horaria.

Lo dejé en comentario y me funcionó.

Cordialmente,

Chascarrilla.
Avatar de Usuario
Chascarrilla
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2012-07-19 10:01 @459

Re: Suma de fechas

Notapor explorer » 2014-04-15 18:48 @825

No, no es así...

El bucle foreach(), ciertamente, recorre todas las posibilidades para encontrar la zona horaria. Si termina el bucle, es entonces cuando se encuentra el confess(), para indicar el error. Pero eso no es un error de DM5. Es el comportamiento esperado: si no se encuentra la zona horaria hay que informar al usuario.

Fíjate que dentro del foreach() hay unos cuántos return(). Si, al menos uno de los métodos para averiguar la zona tiene éxito, entonces la subrutina sale por uno de los return(), y ya no se ejecuta el confess().

Así que... comentando la línea, lo que has hecho es esconder el error, pero el error continúa. Permites que el programa continué, pero sin conocer realmente en qué zona horaria se está ejecutando. Y para algunos cálculos de fechas, puede ser necesario.

En lugar de eso, puedes intentar activar alguno de los métodos que DM5 está utilizando:
  • Busca por la variable TZ dentro del archivo de configuración Manip.cnf
  • Busca por la variable TZ (en las variables de entorno del sistema operativo)
  • Ejecuta el comando date del sistema (salvo en Windows, que sabemos que no trae nada de esto)
  • Mira a ver si está definida la variable global $TZ en el programa (por ejemplo: our $TZ = 'Europe/Madrid';)
  • Mira el contenido del archivo /etc/TIMEZONE
  • Mira el contenido del archivo /etc/timezone (obvio que en Windows, estas dos últimas tampoco funcionarán)
Desde luego, la más sencilla es la de crear una variable $TZ dentro del programa. Pero yo sigo prefiriendo hacerlo con Date_Init(). Es más visible.
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: Suma de fechas

Notapor Chascarrilla » 2014-04-23 10:28 @478

Hola, explorer.

Verifiqué el foreach() y, efectivamente, tiene los return().

Le quité el comentario al error en el DM5 y dejé la línea como me lo indicaste:

Date_Init( "Language=Spanish", "DateFormat=non-US", "TZ=-05:00" )

Y funciona.

Terminé el programa que retorna cuántos días de retraso lleva un requerimiento omitiendo fines de semana y los festivos en Colombia, ya que de los 18 que tenemos solo 6 son fechas fijas. Aún me falta pulir algunos detalles, pero sin tu ayuda no lo habría logrado.

Mil y mil gracias.

:D :D
Avatar de Usuario
Chascarrilla
Perlero nuevo
Perlero nuevo
 
Mensajes: 9
Registrado: 2012-07-19 10:01 @459

Anterior

Volver a Intermedio

¿Quién está conectado?

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