Foros del Web » Programando para Internet » PHP »

Error al usar la funcion mktime con fecha inferior a 1970 , como reemplazarla?

Estas en el tema de Error al usar la funcion mktime con fecha inferior a 1970 , como reemplazarla? en el foro de PHP en Foros del Web. tengo este codigo para que ejecute un calendario el usuario y poder digitar la fecha, sin embargo al ingresar fechas inferiores a 1970 arroja el ...
  #1 (permalink)  
Antiguo 06/07/2012, 14:51
Avatar de mager3  
Fecha de Ingreso: junio-2012
Ubicación: Medellin
Mensajes: 318
Antigüedad: 11 años, 10 meses
Puntos: 4
Exclamación Error al usar la funcion mktime con fecha inferior a 1970 , como reemplazarla?

tengo este codigo para que ejecute un calendario el usuario y poder digitar la fecha, sin embargo al ingresar fechas inferiores a 1970 arroja el siguiente error

warning mktime windows does not support negative values for this function en line 3, 69 , 71

Código PHP:
Ver original
  1. <?php
  2. function calcula_numero_dia_semana($dia,$mes,$ano){
  3.     $numerodiasemana = date('w', mktime(0,0,0,$mes,$dia,$ano));
  4.     if ($numerodiasemana == 0)
  5.         $numerodiasemana = 6;
  6.     else
  7.         $numerodiasemana--;
  8.     return $numerodiasemana;
  9. }
  10.  
  11. //funcion que devuelve el último día de un mes y año dados
  12. function ultimoDia($mes,$ano){
  13.     $ultimo_dia=28;
  14.     while (checkdate($mes,$ultimo_dia + 1,$ano)){
  15.        $ultimo_dia++;
  16.     }
  17.     return $ultimo_dia;
  18. }
  19.  
  20. function dame_nombre_mes($mes){
  21.      switch ($mes){
  22.         case 1:
  23.             $nombre_mes="Enero";
  24.             break;
  25.         case 2:
  26.             $nombre_mes="Febrero";
  27.             break;
  28.         case 3:
  29.             $nombre_mes="Marzo";
  30.             break;
  31.         case 4:
  32.             $nombre_mes="Abril";
  33.             break;
  34.         case 5:
  35.             $nombre_mes="Mayo";
  36.             break;
  37.         case 6:
  38.             $nombre_mes="Junio";
  39.             break;
  40.         case 7:
  41.             $nombre_mes="Julio";
  42.             break;
  43.         case 8:
  44.             $nombre_mes="Agosto";
  45.             break;
  46.         case 9:
  47.             $nombre_mes="Septiembre";
  48.             break;
  49.         case 10:
  50.             $nombre_mes="Octubre";
  51.             break;
  52.         case 11:
  53.             $nombre_mes="Noviembre";
  54.             break;
  55.         case 12:
  56.             $nombre_mes="Diciembre";
  57.             break;
  58.     }
  59.     return $nombre_mes;
  60. }
  61.  
  62. function dame_estilo($dia_imprimir){
  63.     global $mes,$ano,$dia_solo_hoy,$tiempo_actual;
  64.     //dependiendo si el día es Hoy, Domigo o Cualquier otro, devuelvo un estilo
  65.     if ($dia_solo_hoy == $dia_imprimir && $mes==date("n", $tiempo_actual) && $ano==date("Y", $tiempo_actual)){
  66.         //si es hoy
  67.         $estilo = " class='hoy'";
  68.     }else{
  69.         $fecha=mktime(12,0,0,$mes,$dia_imprimir,$ano);
  70.         if (date("w",$fecha)==0){
  71.             //si es domingo
  72.             $estilo = " class='domingo'";
  73.         }else{
  74.             //si es cualquier dia
  75.             $estilo = " class='diario'";
  76.         }
  77.     }
  78.     return $estilo;
  79. }
  80.  
  81. function mostrar_calendario($mes,$ano){
  82.     global $parametros_formulario;
  83.     //tomo el nombre del mes que hay que imprimir
  84.     $nombre_mes = dame_nombre_mes($mes);
  85.    
  86.     //construyo la tabla general
  87.     echo '<table class="tablacalendario" cellspacing="3" cellpadding="2" border="0">';
  88.     echo '<tr><td colspan="7" class="tit">';
  89.     //tabla para mostrar el mes el año y los controles para pasar al mes anterior y siguiente
  90.     echo '<table width="100%" cellspacing="2" cellpadding="2" border="0"><tr><td class="messiguiente">';
  91.     //calculo el mes y ano del mes anterior
  92.     $mes_anterior = $mes - 1;
  93.     $ano_anterior = $ano;
  94.     if ($mes_anterior==0){
  95.         $ano_anterior--;
  96.         $mes_anterior=12;
  97.     }
  98.     echo "<a href='index.php?$parametros_formulario&nuevo_mes=$mes_anterior&nuevo_ano=$ano_anterior'><span>&lt;&lt;</span></a></td>";
  99.     echo "<td class='titmesano'>$nombre_mes $ano</td>";
  100.     echo "<td class='mesanterior'>";
  101.     //calculo el mes y ano del mes siguiente
  102.     $mes_siguiente = $mes + 1;
  103.     $ano_siguiente = $ano;
  104.     if ($mes_siguiente==13){
  105.         $ano_siguiente++;
  106.         $mes_siguiente=1;
  107.     }
  108.     echo "<a href='index.php?$parametros_formulario&nuevo_mes=$mes_siguiente&nuevo_ano=$ano_siguiente'><span>&gt;&gt;</span></a></td></tr></table></td></tr>";
  109.     echo '  <tr>
  110.                 <td width="14%" class="diasemana">L</td>
  111.                 <td width="14%" class="diasemana">M</td>
  112.                 <td width="14%" class="diasemana">X</td>
  113.                 <td width="14%" class="diasemana">J</td>
  114.                 <td width="14%" class="diasemana">V</td>
  115.                 <td width="14%" class="diasemana">S</td>
  116.                 <td width="14%" class="diasemana">D</td>
  117.             </tr>';
  118.    
  119.     //Variable para llevar la cuenta del dia actual
  120.     $dia_actual = 1;
  121.    
  122.     //calculo el numero del dia de la semana del primer dia
  123.     $numero_dia = calcula_numero_dia_semana(1,$mes,$ano);
  124.     //echo "Numero del dia de demana del primer: $numero_dia <br>";
  125.    
  126.     //calculo el último dia del mes
  127.     $ultimo_dia = ultimoDia($mes,$ano);
  128.    
  129.     //escribo la primera fila de la semana
  130.     echo "<tr>";
  131.     for ($i=0;$i<7;$i++){
  132.         if ($i < $numero_dia){
  133.             //si el dia de la semana i es menor que el numero del primer dia de la semana no pongo nada en la celda
  134.             echo '<td class="diainvalido"><span></span></td>';
  135.         } else {
  136.             echo "<td " . dame_estilo($dia_actual) . "><span><a href='javascript:devuelveFecha($dia_actual,$mes,$ano)'>$dia_actual</a></span></td>";
  137.             $dia_actual++;
  138.         }
  139.     }
  140.     echo "</tr>";
  141.    
  142.     //recorro todos los demás días hasta el final del mes
  143.     $numero_dia = 0;
  144.     while ($dia_actual <= $ultimo_dia){
  145.         //si estamos a principio de la semana escribo el <TR>
  146.         if ($numero_dia == 0)
  147.             echo "<tr>";
  148.         echo "<td " . dame_estilo($dia_actual) . "><span><a href='javascript:devuelveFecha($dia_actual,$mes,$ano)'>$dia_actual</a></span></td>";
  149.         $dia_actual++;
  150.         $numero_dia++;
  151.         //si es el uñtimo de la semana, me pongo al principio de la semana y escribo el </tr>
  152.         if ($numero_dia == 7){
  153.             $numero_dia = 0;
  154.             echo "</tr>";
  155.         }
  156.     }
  157.    
  158.     //compruebo que celdas me faltan por escribir vacias de la última semana del mes
  159.     if ($numero_dia != 0){
  160.         for ($i=$numero_dia;$i<7;$i++){
  161.             echo '<td class="diainvalido"><span></span></td>';
  162.         }
  163.     }
  164.    
  165.     echo "</tr>";
  166.     echo "</table>";
  167. }  
  168.  
  169. function formularioCalendario($mes,$ano){
  170.     global $parametros_formulario;
  171. echo '
  172.     <br><form action="index.php?' . $parametros_formulario . '" method="POST">
  173.     <table align="center" cellspacing="2" cellpadding="2" border="0" class=tform>
  174.     <tr>';
  175. echo '
  176.    <td align="center" valign="top">
  177.         Mes: <br>
  178.         <select name=nuevo_mes>
  179.         <option value="1"';
  180. if ($mes==1)
  181.  echo "selected";
  182. echo'>Enero
  183.         <option value="2" ';
  184. if ($mes==2)
  185.     echo "selected";
  186. echo'>Febrero
  187.         <option value="3" ';
  188. if ($mes==3)
  189.     echo "selected";
  190. echo'>Marzo
  191.         <option value="4" ';
  192. if ($mes==4)
  193.     echo "selected";
  194. echo '>Abril
  195.         <option value="5" ';
  196. if ($mes==5)
  197.         echo "selected";
  198. echo '>Mayo
  199.         <option value="6" ';
  200. if ($mes==6)
  201.     echo "selected";
  202. echo '>Junio
  203.         <option value="7" ';
  204. if ($mes==7)
  205.     echo "selected";
  206. echo '>Julio
  207.         <option value="8" ';
  208. if ($mes==8)
  209.     echo "selected";
  210. echo '>Agosto
  211.         <option value="9" ';
  212. if ($mes==9)
  213.     echo "selected";
  214. echo '>Septiembre
  215.         <option value="10" ';
  216. if ($mes==10)
  217.     echo "selected";
  218. echo '>Octubre
  219.         <option value="11" ';
  220. if ($mes==11)
  221.     echo "selected";
  222. echo '>Noviembre
  223.         <option value="12" ';
  224. if ($mes==12)
  225.     echo "selected";
  226. echo '>Diciembre
  227.         </select>
  228.         </td>';
  229. echo '     
  230.         <td align="center" valign="top">
  231.         A&ntilde;o: <br>
  232.         <select name=nuevo_ano>';
  233.  
  234. //este bucle se podría hacer dependiendo del número de año que se quiera mostrar
  235. //yo voy a mostar 70 años atrás y 10 adelante de la fecha mostrada en el calendario
  236. for ($anoactual=$ano-70; $anoactual<=$ano+10; $anoactual++){
  237.     echo '<option value="' . $anoactual . '" ';
  238.     if ($ano==$anoactual) {
  239.         echo "selected";
  240.     }
  241.     echo '>' . $anoactual . '</option>';
  242. }
  243. echo '
  244.     </select>
  245.         </td>';
  246. echo '
  247.     </tr>
  248.     <tr>
  249.         <td colspan="2" align="center"><input type="Submit" value="[ IR A ESE MES ]"></td>
  250.     </tr>
  251.     </table><br>
  252.    
  253.     <br>
  254.    
  255.     </form>';
  256. }
  257.    
  258. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  259. //Función que escribe en la página un fomrulario preparado para introducir una fecha y enlazado con el calendario para seleccionarla comodamente
  260. ////////////////////////////////////////////////////////////////////////////////////////////////////////////
  261. function escribe_formulario_fecha_vacio($nombrecampo,$nombreformulario){
  262.     //Esa variable $raiz sirve para cuando se llama al calendario desde otra ruta, para poder acceder a él
  263.     global $raiz; //empieza en . termina en /
  264.     echo '
  265.     <INPUT name="'.$nombrecampo.'" size="10" class="inputfecha" onclick="muestraCalendario(\''. $raiz.'\',\''. $nombreformulario .'\',\''.$nombrecampo.'\')" onfocus="blur()">
  266.     </div>
  267.     '; 
  268. }
  269. ?>

como puedo cambiar el codigo para que la funcion mktime sea reemplazada porque comprendo por lo que he investigado que esta funcion tiene ese tipo de problemas?
  #2 (permalink)  
Antiguo 06/07/2012, 15:16
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: Error al usar la funcion mktime con fecha inferior a 1970 , como reemplaza

eso de debe a que ése es precisamente la fecha de inicio del epoch UNIX.

existe una librería adodb_date.php que resuelve ése problema o intenta usar el objeto DateTime().
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 10/07/2012, 07:49
Avatar de mager3  
Fecha de Ingreso: junio-2012
Ubicación: Medellin
Mensajes: 318
Antigüedad: 11 años, 10 meses
Puntos: 4
Respuesta: Error al usar la funcion mktime con fecha inferior a 1970 , como reemplaza

muchas gracias, ya la estoy probando, ....

Etiquetas: mktime
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 00:15.