Ver Mensaje Individual
  #18 (permalink)  
Antiguo 18/07/2003, 13:52
leonardop
 
Fecha de Ingreso: julio-2003
Mensajes: 165
Antigüedad: 20 años, 9 meses
Puntos: 1
Qué tal, amigos...

¡Qué bien que hayas encontrado un fallo en el código, Pablo! Cuando uno dispone del código de una aplicación que piensa que funciona bien, y de repente aparece un bug inesperado, casi siempre es motivo de celebración, creo yo. En ocasiones la oportunidad que se presenta ahí para estudiar y aprender algo nuevo es mucho más alta que en la actividad regular de escribir código nuevo que no se ha probado aun.

(Por supuesto, no es motivo de celebración cuando la aplicación en cuestión es crítica y opera sobre situaciones de verdadera importancia... A veces los errores de programación pueden costar empleos, pero es mucho más grave cuando cuestan vidas, por ejemplo...)

En fin, he probado la situación que describes y me he dado cuenta que el problema ha sido mi descuido a la hora de operar con los periodos de las tarifas. Por pereza, cualidad que muchas veces resulta útil al escribir software, en este caso el programa no puede realizar cálculos precisos cuando los periodos de tiempo incluyen "saltos" de año.

La solución sería incluir campos para el valor de año, en los arreglos asociativos de las tarifas:

Código:
$tarifas = array (array ('valor'       => 107,
                         'inicio_dia'  => 1,
                         'inicio_mes'  => 1,
                         'inicio_anyo' => 2003,
                         'fin_dia'     => 20,
                         'fin_mes'     => 3,
                         'fin_anyo'    => 2003),

                  array ('valor'      => -1,
                         'inicio_dia' => 30,
                         'inicio_mes' => 5,
                         'inicio_anyo' => 2003,
                         'fin_dia'    => 31,
                         'fin_mes'    => 5,
                         'fin_anyo'    => 2003));

Y luego emplearlos acordemente:

Código:
        $tarifa_inicio_unix = mktime (0, 0, 0,
                                      $tarifas[$i]['inicio_mes'],
                                      $tarifas[$i]['inicio_dia'],
                                      $tarifas[$i]['inicio_anyo']);

        $tarifa_fin_unix = mktime (0, 0, 0,
                                   $tarifas[$i]['fin_mes'],
                                   $tarifas[$i]['fin_dia'],
                                   $tarifas[$i]['fin_anyo']);
Sobre tu última inquietud, el valor con punto decimal que quieres usar como entero, una opción es que le apliques un "moldeamiento de tipos" (o type casting en Inglés). Un ejemplo de esto sería:

Código:
<?php
$real = 244.04166666667;  // Valor real cualquiera

$entero = (int) $real;  // Realizando "type casting"

print "El valor $real moldeado a entero es $entero";
?>
Saludos.