Ver Mensaje Individual
  #2 (permalink)  
Antiguo 16/06/2016, 13:06
Pantaláimon
 
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