me rompi la cabeza en su dia con eso.
necesitas dos cosas:
- rutina que dada una fecha cualquiera, proporcione el dia de la semana (lunes, martes, miercoles... etcetc) entendiendo como lunes-0->6-domingo o algo similar
- rutina que dadas dos fechas, de el numero de dias de diferencia entre ellas
la norma ISO8601 indica que si la primera semana tiene menos de 3 dias, no debe ser contada como la primera semana, sino como la ultima del año anterior. si la primera semana tiene 4 o mas dias, si debe ser considerada como la primera semana del año.
tu problema se divide, de esta forma, en dos subproblemas de facil solucion:
1) ¿que fecha fue el primer lunes de la primera semana del año?
2) ¿cual es la distancia en DIAS desde la fecha que quiero calcular su numero de semana a la fecha del lunes de la primera semana del año? realizando una division entre 7, que es el numero de dias que tiene una semana, tienes tu buscado numero de semana
la respuesta a la pregunta numero 1, que es la complicada es:
saca el dia de la semana del dia 1 de enero del año en cuestion:
- si el dia en cuestion es jueves o anterior, el dia 1 de enero de dicho año ES la primera semana, ahora solo tendras que calcular que fecha fue dicho lunes, para eso, simplemente coge (1/1/yyyy)-dia de la semana en numero(ya sabes, 0 para lunes y 6 para domingo).
- si el dia en cuestion es viernes o superior, la semana SIGUIENTE es la primera semana del año, asi que calcula el lunes de dicha semana siguiente.
tabla resumen:
si (1/1/yyyy)=(lunes) entonces lunes de la semana 1=1/1/yyyy
si (1/1/yyyy)=(martes) entonces lunes de la semana 1=31/12/yyyy-1
si (1/1/yyyy)=(miercoles) entonces lunes de la semana 1=30/12/yyyy-1
si (1/1/yyyy)=(jueves) entonces lunes de la semana 1 es 29/12/yyyy-1
si (1/1/yyyy)=(viernes) entonces lunes de la semana 1 es 4/1/yyyy
si (1/1/yyyy)=(sabado) entonces lunes de la semana 1 es 3/1/yyyy
si (1/1/yyyy)=(domingo) entonces lunes de la semana 1 es 2/1/yyyy
en fins, con esta tabla resumen/precalculada, y la rutina de diferencia de dias y su correspondiente division entre 7, ya tienes tu problema resuelto.
ya pueden cerrar el telon