elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Calcular días hábiles en PHP
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Calcular días hábiles en PHP  (Leído 7,786 veces)
tomasvreal28

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Calcular días hábiles en PHP
« en: 28 Noviembre 2015, 17:53 pm »

Buenas espero que me puedan ayudar
estoy queriendo sumar 10 días hábiles (Lunes a Viernes) y sin contar feriados
a partir de una fecha
Lo que hecho es sumarle 10 días pero no quiero que cuente los sábados ni domingos y tampoco los feriados

Por ejemplo estos son algunos feriados

2015-12-08     2015-12-25     2016-01-01    


Código
  1. <?php
  2.  
  3. require_once('conexion.php');
  4.  
  5. $num_accion=$_POST['num_accion'];
  6. $fecha_noti=$_POST['fecha_noti'];
  7.  
  8. $fecha_venci_noti= date("Y-m-d", strtotime("$fecha_noti + 10 days"));
  9.  
  10. $sql="update tbldias set
  11.  
  12. dc_fecha_noti='".$fecha_noti."',
  13. dc_fecha_venci_noti='".$fecha_venci_noti."'
  14.  
  15. where dc_num_accion=".$num_accion;
  16.  
  17. $res=mysql_query($sql,$cnx);
  18.  
  19. ?>

Mod: Obligatorio el uso de etiquetas GeSHi.


« Última modificación: 2 Diciembre 2015, 14:53 pm por #!drvy » En línea

gAb1


Desconectado Desconectado

Mensajes: 731


Ver Perfil
Re: Calcular días hábiles en PHP
« Respuesta #1 en: 29 Noviembre 2015, 00:16 am »

Por favor favor usa las etiquetas de código GeSHi (tienes una lista para elegir el tipo de lenguaje). Modifica para ponerlas.

Tu lo que quieres es obtener, en php, solo los dias de trabajo o dias normales.

También te diré que no necesitas usar tantas comillas... Las comillas dobles ( " " ) solo son necesarias para que php interprete las barras invertidas ( \ ) y puedas imprimir códigos ASCII y otros carácteres especiales como nuevas lineas ( \n ), etc. Para simple texto con las normales es suficiente, tal solo cierralas y pones la variable.

Código
  1. $sql='UPDATE tbldias
  2.      SET    dc_fecha_noti       = ' . $fecha_noti . ',
  3.             dc_fecha_venci_noti = ' . $fecha_venci_noti . '
  4.      WHERE  dc_num_accion       = ' . $num_accion;

PHP no puede saber que dias son festivos (solo puede saber cual es Sabado y cual Domingo). Necesitarás crear una función con un array que contenga todos los dias festivos y que devuelva solo los que estén entre la fecha indicada y la fecha final (aunque si no son muchos no hace falta filtrarlos). No necesitas poner el año:

Código
  1. // $startDate sería $fecha_noti y $days los dias a sumar (por si los pides en el formulario)
  2. function getWorkingDays($startDate, $days) {
  3.    // aquí tendrías que poner todos los dias festivos menos los sabados y domingos.
  4.    // o si son muchos crear una funcion que devuelva solo los necesarios...
  5.    // (por ejemplo 10 dias festivos a partir de la fecha indicada, dependiendo de $days)
  6.    $holidays  = array(
  7.        'New Year\'s Day'   => '01-01'
  8.        'Trivia Day'        => '01-04'
  9.        'National Bird Day' => '01-05'
  10.    );
  11.    $weekend   = array('Sun' => '','Sat' => '');
  12.    $date      = new DateTime($startDate); // recuerda solo mes y dia
  13.    $nextDay   = clone $date;
  14.    $i         = 0;
  15.    $nextDates = array();
  16.  
  17.    while ($i < $days) {
  18.        $nextDay->add('P1D');
  19.        if (isset($holidays[$nextDay->format('m-d')])) continue;
  20.        if (isset($weekend[$nextDay->format('D')])) continue;
  21.        $nextDates[] = $nextDay->format('Y-m-d');
  22.        $i++;
  23.    }
  24.  
  25.    return $nextDates;
  26. }

Así lo harías en la página PHP:

Código
  1. require_once('conexion.php');
  2. require_once('functions.php'); // si tienes un archivo para las funciones pon la función de arriba, o crealo
  3.  
  4. // si el formulario no está en esta página quita el isset() dejando solo el filter_input();
  5. $num_accion = isset ( $_POST['num_accion'] ) ? filter_input ( INPUT_POST , 'num_accion' , FILTER_SANITIZE_STRING) : NULL;
  6. $fecha_noti = isset ( $_POST['fecha_noti'] ) ? filter_input ( INPUT_POST , 'fecha_noti' , FILTER_SANITIZE_STRING) : NULL;
  7. $days       = isset( $_POST['days'] ) ? (int) $_POST['days'] : 10; // los que quieras poner por defecto
  8.  
  9. $fecha_venci_noti = getWorkingDays($fecha_noti, $days);
  10.  
  11. ?>
  12. // Aqui puede ir el formulario HTML
  13. <form></form>


En línea

tomasvreal28

Desconectado Desconectado

Mensajes: 12


Ver Perfil
Re: Calcular días hábiles en PHP
« Respuesta #2 en: 2 Diciembre 2015, 01:31 am »


Amigo he probado el codigo pero no funciona

Bueno aquí es donde se guarda 
el formulario esta en otro archivo
lo que pasa es que una vez que se registra
    --> fecha_noti_comu
la   --> fecha_venci_not_comu     
  se guarda sumando 10 días pero quiero que sean días hábiles de los Luneas a Viernes y sin contar los feriados
por ejemplo estos son algunos feriado
-2015-12-08   
-2015-12-25   
-2016-01-01   
 

edita_comunica.php

Código
  1. <?php
  2.  
  3. require_once('conexion.php');
  4.  
  5. $num_accion=$_POST['num_accion'];
  6. $fecha_comunicacion=$_POST['fecha_comunicacion'];
  7. $num_comunicacion=$_POST['num_comunicacion'];
  8. $fecha_noti_comu=$_POST['fecha_noti_comu'];
  9. $estado=$_POST['estado'];
  10.  
  11. $fecha_venci_not_comu= date("Y-m-d", strtotime("$fecha_noti_comu + 10 days"));
  12.  
  13. $dependencia=$_POST['dependencia'];
  14. $traslado=$_POST['traslado'];
  15.  
  16. $sql="update tbldocumentosicr set icr_dependencia='".$dependencia."',icr_fecha_comunicacion='".$fecha_comunicacion."',icr_num_comunicacion='".$num_comunicacion."',
  17. icr_fecha_noti_comu='".$fecha_noti_comu."',icr_estado='".$estado."',icr_fecha_venci_not_comu='".$fecha_venci_not_comu."',
  18. icr_dependencia='".$dependencia."',icr_traslado='".$traslado."'
  19. where icr_num_accion=".$num_accion;
  20. $res=mysql_query($sql,$cnx);
  21.  
  22. ?>

El código del formulario esta en otro archivo y con este no hay problemas

registro_comun.php


Código
  1. <?php
  2.  
  3. require_once("conexion.php");
  4.  
  5. $buscar=$_GET["num_accion"];
  6.  
  7. $query="SELECT * FROM tbldocumentosicr WHERE  icr_num_accion = '$buscar'";
  8.  
  9. $result=mysql_query($query,$cnx) or die("Error: ".mysql_error());
  10.  
  11. if(mysql_num_rows($result) > 0){
  12.  
  13. while($Rs=mysql_fetch_array($result)){
  14.  
  15. ?>
  16.  
  17. <form action="edita_comunica.php"   method="post" enctype="multipart/form-data" onSubmit = "return verifica(this);">
  18.  
  19. <TABLE BGCOLOR="F9FBFC" BORDERCOLOR="EAEAEB"  WIDTH=77%" BORDER=5 CellPadding=10 CellSpacing=1 align="center">
  20.  
  21. <TR>
  22.  
  23. <TD colspan=2 align='center' BGCOLOR="C1D4D6" style="color:#000000"><B><h3>Comunicación</h3></B></TD>
  24.  
  25. </TR>
  26.  
  27. <TR>
  28.  
  29. <TD align=left><B>Acci&oacute;n Inductiva:</B></TD>
  30.  
  31. <TD align=left>
  32.  
  33. <INPUT TYPE="text" NAME="num_accion" readonly="readonly" onMouseOver="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'"  value="<?=$Rs["icr_num_accion"]?>"/>
  34.  
  35. <INPUT  type="hidden" NAME="num_accion2" value="<?=$Rs["icr_num_accion"]?>"/></TD></TR>
  36.  
  37. <TR>
  38.  
  39. <TD align=left><B>RUC:</B></TD>
  40.  
  41. <TD align=left>
  42. <input type="text" name="ruc" readonly="readonly" onmouseover="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'"  event.returnValue = false;" value="<?=$Rs["icr_ruc"]?>"/></TD>
  43.  
  44. </TR>
  45. <TR>
  46. <TD align=left><B>Nombre o Raz&oacute;n Social:</B> </TD>
  47.  
  48. <TD align=left> <INPUT TYPE="text" NAME="contribuyente" readonly="readonly" SIZE=135 onMouseOver="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'" value="<?=$Rs["icr_contribuyente"]?>"/></TD>
  49.  
  50. </TR>
  51.  
  52. <TR>
  53.  
  54. <TD align=left><B>Domicilio Fiscal:</B> </TD>
  55.  
  56. <TD align=left><input type="text" name="domicilio" readonly="readonly" size=135 onMouseOver="this.style.backgroundColor='#FDFDF8'" style="background-color:#FBF9D5" onMouseOut="this.style.backgroundColor='#FBF9D5'" value="<?=$Rs["icr_domicilio"]?>"/></TD>
  57.  
  58. </TR>
  59.  
  60. <TR>
  61.  
  62. <TD align=left><B>Infracci&oacute;n Cometida:</B></TD>
  63.  
  64. <TD align=left>
  65. <SELECT NAME="infraccion" style="background-color:#FBF9D5">
  66. <?php if($Rs["icr_infraccion"]==1){?>
  67. <option value="1" selected>1. Inciso b) numeral 9.3: Condici&oacute;n de domicilio fiscal NO HABIDO</option>
  68. <?php }elseif($Rs["icr_infraccion"]==2){?>
  69. <option value="2" selected>2. Inciso c) numeral 9.3: No comparecer o comparecer fuera del plazo establecido.</option>
  70. <?php }elseif($Rs["icr_infraccion"]==3){?>
  71. <option value="3" selected>3. Inciso d) numeral 9.3: No emitir y/o no otorgar CDP, distintos a gu&iacute;as de remisi&oacute;n (num.1, art.174&deg; CT)</option>
  72. <?php }elseif($Rs["icr_infraccion"]==4){?>
  73. <option value="4" selected>4. Inciso d) numeral 9.3: Omitir llevar libros y/o registros y/o otros medios de control (num.1, art.175&deg; CT)</option>
  74. <?php }elseif($Rs["icr_infraccion"]==5){?>
  75. <option value="5" selected>5. Inciso d) numeral 9.3: No presentar declaraciones determinativas dentro de los plazos (num.1, art.176&deg; CT)</option>
  76. <?php }elseif($Rs["icr_infraccion"]==6){?>
  77. <option value="6" selected>6. Inciso d) numeral 9.3: No exhibir libros, registros u otros documentos solicitados (num.1, art.177&deg; CT)</option>
  78. <?php }elseif($Rs["icr_infraccion"]==7){?>
  79. <option value="1" selected>7. Inciso d) numeral 9.3: No declarar ingresos, rentas, patrimonio, tributos retenidos, o declarar datos falsos</option>
  80.  
  81. <?php }?>
  82.  
  83. </SELECT>  
  84.  
  85. </TD>
  86.  
  87. </TR>
  88.  
  89. <TR>
  90.  
  91.   <TD align=left><B>Fecha<br>Registro:</B></TD>
  92.  
  93.   <TD align=left> <input type="text" name="fecha_registro" readonly="readonly" style="background-color:#FBF9D5" value="<?=$Rs["icr_fecha_registro"]?>"/></TD>
  94.  
  95. </TR>
  96.  
  97. <TR>
  98.  
  99.   <TD align=left><B>Fecha de Emision de la<br>Comunicación:</B></TD>
  100.  
  101.   <TD align=left> <input type="text" name="fecha_comunicacion" id="fecha_comunicacion" style="background-color:#FBF9D5" value="<?=$Rs["icr_fecha_comunicacion"]?>"/>
  102.  
  103. <button type="submit" id="button1">...</button>
  104. <script type="text/javascript">
  105.             Calendar.setup({
  106.               inputField    : "fecha_comunicacion",
  107.               button        : "button1",
  108.               align         : "center"
  109.  
  110.             });
  111.  
  112.               </script>
  113. </TD>
  114.  
  115. </TR>
  116.  
  117. <TR>
  118.  
  119.  <TD align=left><B>Número de Comunicación</B></TD>
  120.  
  121.  <TD colspan=3 align=left><INPUT TYPE='text' NAME="num_comunicacion" size=40 style="background-color:#FBF9D5" value="<?=$Rs["icr_num_comunicacion"]?>"/></TD>
  122.  
  123. </TR>
  124.  
  125. <TR>
  126.  
  127.   <TD align=left><B>Fecha Notificación <br> Comunicación:</B></TD>
  128.  
  129.   <TD align=left> <input type="text" name="fecha_noti_comu" id="fecha_noti_comu" style="background-color:#FBF9D5" value="<?=$Rs["icr_fecha_noti_comu"]?>"/>
  130.  
  131. <button type="submit" id="button2">...</button>
  132. <script type="text/javascript">
  133.             Calendar.setup({
  134.               inputField    : "fecha_noti_comu",
  135.               button        : "button2",
  136.               align         : "center"
  137.  
  138.             });
  139.                 </script>
  140. </TD>
  141.  
  142. </TR>
  143.  
  144. <TR>
  145.  
  146.   <TD align=left><B>Estado:</B></TD>
  147.  
  148.   <TD colspan=3 align=left> <SELECT NAME="estado" style="background-color:#FBF9D5">
  149.  
  150. <?php if($Rs["icr_estado"]==1){?>
  151. <option value="1" selected>Registrado</option>
  152. <option value="2">Con Comunicaci&oacute;n</option>
  153. <option value="3">Notificaci&#38;#243n Comunicaci&#38;#243n</option>
  154. <option value="4">Con Resoluci&oacute;n</option>
  155. <option value="5">Notificado con RI</option>
  156. <option value="6">Reportado</option>
  157.  
  158. <?php }elseif($Rs["icr_estado"]==2){?>
  159. <option value="1" >Registrado</option>
  160. <option value="2"selected>Con Comunicaci&oacute;n</option>
  161. <option value="3">Notificaci&#38;#243n Comunicaci&#38;#243n</option>
  162. <option value="4">Con Resoluci&oacute;n</option>
  163. <option value="5">Notificado con RI</option>
  164. <option value="6">Reportado</option>
  165.  
  166. <?php }elseif($Rs["icr_estado"]==3){?>
  167. <option value="1">Registrado</option>
  168. <option value="2">Con Comunicaci&oacute;n</option>
  169. <option value="3" selected>Notificaci&#38;#243n Comunicaci&#38;#243n</option>
  170. <option value="4">Con Resoluci&oacute;n</option>
  171. <option value="5">Notificado con RI</option>
  172. <option value="6">Reportado</option>
  173.  
  174. <?php }elseif($Rs["icr_estado"]==4){?>
  175. <option value="1">Registrado</option>
  176. <option value="2">Con Comunicaci&oacute;n</option>
  177. <option value="3">Notificaci&#38;#243n Comunicaci&#38;#243n</option>
  178. <option value="4" selected>Con Resoluci&oacute;n</option>
  179. <option value="5">Notificado con RI</option>
  180. <option value="6">Reportado</option>
  181.  
  182. <?php }elseif($Rs["icr_estado"]==5){?>
  183. <option value="1">Registrado</option>
  184. <option value="2">Con Comunicaci&oacute;n</option>
  185. <option value="3">Notificaci&#38;#243n Comunicaci&#38;#243n</option>
  186. <option value="4">Con Resoluci&oacute;n</option>
  187. <option value="5" selected>Notificado con RI</option>
  188. <option value="6">Reportado</option>
  189.  
  190. <?php }elseif($Rs["icr_estado"]==6){?>
  191. <option value="1">Registrado</option>
  192. <option value="2">Con Comunicaci&oacute;n</option>
  193. <option value="3">Notificaci&#38;#243n Comunicaci&#38;#243n</option>
  194. <option value="4">Con Resoluci&oacute;n</option>
  195. <option value="5">Notificado con RI</option>
  196. <option value="6" selected>Reportado</option>
  197.  
  198. <?php }?>
  199.  
  200. </SELECT></TD>
  201.  
  202. </TR>
  203.  
  204. </TABLE>
  205.  
  206. <center>  
  207.  
  208. <input type="hidden" name="dependencia"  value="3"/>
  209. <input type="hidden" name="traslado"  value="3"/>
  210.  
  211. </br>
  212. <input type="submit" name="gua" value="Guardar" style='width:100px; height:35px'>
  213.  
  214. <input type="button" name="reg" value="Regresar" style='width:100px; height:35px' onClick="history.back()">
  215.  
  216. </center>
  217.  
  218. </form>
  219.  
  220. <?php
  221.  
  222. }
  223.  
  224.  
  225. }else{
  226.  
  227. echo "<center>No se hallaron registros que coincidan con el criterio de búsqueda</center>";
  228.  
  229. }
  230.  
  231. ?>
  232.  
  233. </body>
  234.  
  235. </html>
  236.  
  237.  


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
calendario dias habiles en java
Java
almita 3 9,083 Último mensaje 29 Septiembre 2005, 16:31 pm
por Ragnarok
Calcular días entre dos fechas...
Ejercicios
*-.Sub-Vorbio.-* 0 4,864 Último mensaje 13 Noviembre 2008, 00:51 am
por *-.Sub-Vorbio.-*
Ayuda con código para calcular los días de un mes
Programación C/C++
D_F4UL7 1 2,077 Último mensaje 25 Octubre 2016, 15:22 pm
por MAFUS
[AYUDA] Calcular los dias entre dos meses C++
Programación C/C++
Kougami 6 4,911 Último mensaje 16 Noviembre 2016, 15:43 pm
por engel lex
Metodo para calcular dias transcurridos
Programación C/C++
Beginner Web 5 1,880 Último mensaje 26 Septiembre 2018, 14:28 pm
por M4RQUS
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines