Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Contar días de un mes (sin domingo y lunes)

Estas en el tema de Contar días de un mes (sin domingo y lunes) en el foro de Javascript en Foros del Web. Hola, Tengo dos fechas que corresponden al primer y último día del mes @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original var fecha1 = new Date ...
  #1 (permalink)  
Antiguo 16/06/2016, 11:22
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 5 meses
Puntos: 15
Contar días de un mes (sin domingo y lunes)

Hola,

Tengo dos fechas que corresponden al primer y último día del mes

Código Javascript:
Ver original
  1. var fecha1 = new Date(2016,4,1);
  2. var fecha2 = new Date(2016,5,0);

Si utilizo

Código Javascript:
Ver original
  1. var dias = (fecha2-fecha1)/86400/1000

Obtengo todo los días del mes, pero necesito que no me cuente los días lunes y domingos. Alguien puede ayudarme? :S
  #2 (permalink)  
Antiguo 16/06/2016, 13:06
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: Contar días de un mes (sin domingo y lunes)

Para ello hay que saber:

1) dado cierto mes, ¿cuantos domingos tiene?
2) dado cierto mes, ¿cuantos lunes tiene?

Una vez sabemos esto solo hay que restar estos a los días del mes.

El problema 1) y 2) se puede abstraer al siguiente problema más genérico:
dado cierto mes y cierto dia X de la semana, ¿cuantos dias X hay? Donde X se refiere a un número entre 0 y 6 correspondiente a los días de domingo a lunes siguiendo el patrón de la función getDay

Para ello es necesario saber en qué día del mes cae el primer día X de la semana. Eso parece fácil. Una vez sabido ese día del mes que llamaré n enseguida caemos en que tenemos justamente Math.ceil((cantidadDiasMes - n + 1)/7).

En fin, que cuesta menos escribir el código que explicarlo:

Código Javascript:
Ver original
  1. function firstDayInMonth(dayOfWeek, month, year) {
  2.     firstDayOfMonth = new Date(year, month, 1);
  3.     return (dayOfWeek - firstDayOfMonth.getDay() + 7) % 7 + 1;
  4. }
  5.  
  6. function daysOfMonth (month, year) {
  7.     return new Date(year, month + 1, 0).getDate();
  8. }
  9.  
  10. function daysOfWeekInMonth(dayOfWeek, month, year) {
  11.     return Math.ceil((daysOfMonth(month, year) - firstDayInMonth(dayOfWeek, month, year) + 1) / 7);
  12. }
  13.  
  14. function daysOfMonthWithout(month, year, discarding) {
  15.     return discarding.reduce(function (days, dayOfWeek) {
  16.         return days - daysOfWeekInMonth(dayOfWeek, month, year)
  17.     }, daysOfMonth(month, year));
  18. }
  19.  
  20. // descartamos domingos y lunes (0 y 1) un junio de 2016
  21. daysOfMonthWithout(5, 2016, [0, 1]) // 22

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils
  #3 (permalink)  
Antiguo 16/06/2016, 14:59
 
Fecha de Ingreso: junio-2011
Mensajes: 289
Antigüedad: 13 años, 5 meses
Puntos: 15
Respuesta: Contar días de un mes (sin domingo y lunes)

wow si que me es difícil entender todo ese código xD

la otra solución que encontré es esta

Código Javascript:
Ver original
  1. while(fecha1<=fecha2){
  2.     if(fecha1.getDay() > 1)
  3.      dias++;
  4.     fecha1.setDate(fecha1.getDate()+1)
  5. }

mientras la fecha 1 sea menor o igual a la fecha 2, obtengo el día y si es mayor a 1 (de martes a sábado) sumo a la variable. Luego agrego un día a la fecha 1.


Muchas gracias por tu respuesta y tiempo.
  #4 (permalink)  
Antiguo 16/06/2016, 15:33
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 18 años, 4 meses
Puntos: 32
Respuesta: Contar días de un mes (sin domingo y lunes)

Cierto, se puede hacer con un bucle. Aunque como ves con el código que expuse no es necesario recorrer todos los días para contar los días del mes excepto lunes y domingos.

Cualquier cosa que no entiendas ya me dices. Como ves, para obtener los días de un mes tampoco es necesario restar. La función daysOfMonth presenta otra alternativa sin la división que hacías para obtener los días. (getDate es otra función interesante a conocer)

Saludos!
__________________
github.com/xgbuils | npm/xgbuils

Etiquetas: domingo
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 16:18.