Actualización: El algoritmo de este tip ha sido mejorando y publicado en: Calcular el número de semana actual del año con Javascript.
Me encontraba en el dilema de averiguar el numero de la semana del año de una fecha dada mediante javascript, el motivo o porque es lo de menos, y me vi buscando una función propia de JavaScript que haga esto como la de la mayoría de lenguajes, grade fue mi sorpresa cuando me di cuenta que dicha función no existía, así que busque otra solución, busque aquí y allá encontré algunos alcances y al final logres sacar esta humilde función que espero resuelva para todos este:
Requerimientos
- Conocimiento básico de Javascript
- Sentido Común
- Una pizca de concentración
¿Cómo hacerlo?
Más importante que el código para resolver el problema es el proceso volitivo de como resolverlo, aquí esta el como lo pensé:Problema
- Tenemos una fecha y no sabemos el numero de semana del año al que pertenece.
Sabemos
- Sabemos que el año tiene 52 semana.
- Que la semana empieza el Lunes.
- Que el año empieza el 1 de Enero.
- Que si el 1 de Enero no es Lunes entonces pertenece a la semana 52 del año anterior.
- Que a cada fecha le corresponde una marca de tiempo.
- Que las marcas de tiempo se operar matemáticamente ( + , - , * , / ).
Podemos
- Obtener la marca de tiempo del 1 de Enero del mismo año de la fecha en cuestión.
- Obtener la marca de tiempo de la fecha en cuestión.
- Compensar ambas fechas en caso que el 1 de Enero no sea Lunes.
- Restar ambas marcas de tiempo para obtener una nueva que represente al tiempo transcurrida entre ambas.
- Dividir esa marca de tiempo hasta obtener la unidad de tiempo deseada.
Si fuera un poco más técnico se podría decir que sería el Algoritmo, y con estos pasos podemos resolver el mismo problema con cualquier lenguaje
El Código
Ahora lo resolveremos con JavaScript les dejo el resto de lenguajes a ustedes, el código este explicado paso a paso aqui que esten muy atentos:
Código :
// A esta funcion se le pasa el parametro en formato fecha // dd/mm/yyyy o dd-mm-yyyy ambos son aceptados function semanadelano($fecha){ $const = [2,1,7,6,5,4,3]; // Constantes para el calculo del primer dia de la primera semana del año if ($fecha.match(/\//)){ $fecha = $fecha.replace(/\//g,"-",$fecha); }; // Con lo anterior permitimos que la fecha pasada a la funcion este // separada por "/" al remplazarlas por "-" mediante .replace y el uso // de expresiones regulares $fecha = $fecha.split("-"); // Partimos la fecha en trozos para obtener dia, mes y año por separado $dia = eval($fecha[0]); $mes = eval($fecha[1]); $ano = eval($fecha[2]); if ($mes!=0) { $mes--; }; // Convertimos el mes a formato javascript 0=enero $dia_pri = new Date($ano,0,1); $dia_pri = $dia_pri.getDay(); // Obtenemos el dia de la semana del 1 de enero $dia_pri = eval($const[$dia_pri]); // Obtenemos el valor de la constante correspondiente al día $tiempo0 = new Date($ano,0,$dia_pri); // Establecemos la fecha del primer dia de la semana del año $dia = ($dia+$dia_pri); // Sumamos el valor de la constante a la fecha ingresada para mantener // los lapsos de tiempo $tiempo1 = new Date($ano,$mes,$dia); // Obtenemos la fecha con la que operaremos $lapso = ($tiempo1 - $tiempo0) // Restamos ambas fechas y obtenemos una marca de tiempo $semanas = Math.floor($lapso/1000/60/60/24/7); // Dividimos la marca de tiempo para obtener el numero de semanas if ($dia_pri == 1) { $semanas++; }; // Si el 1 de enero es lunes le sumamos 1 a la semana caso contrarios el // calculo nos daria 0 y nos presentaria la semana como semana 52 del // año anterior if ($semanas == 0) { $semanas=52; $ano--; }; // Establecemos que si el resultado de semanas es 0 lo cambie a 52 y // reste 1 al año esto funciona para todos los años en donde el 1 de // Enero no es Lunes if ($ano < 10) { $ano = '0'+$ano; }; // Por pura estetica establecemos que si el año es menor de 10, aumente // un 0 por delante, esto para aquellos que ingresen formato de fecha // corto dd/mm/yy alert($semanas+" - "+$ano); // Con esta sentencia arrojamos el resultado. Esta ultima linea puede ser // cambiada a gusto y conveniencia del lector };
Si encuentran algún error favor de hacerlo saber , espero les halla sido de mucha utilidad.
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por danyrik el 20 de Junio de 2009
por cierto, no es un tema menor, el jueguito kadokado es por semanas
Por Zguillez el 20 de Junio de 2009
NeoCesar :
Requerimientos
juas! esos requerimientos habría que ponérselos a todos los tips jaja buen detalle
Por Tom el 20 de Junio de 2009
Por NeoCesar el 21 de Junio de 2009
Tom-blog :
Al principio pense lo mismo pero, como indico lo que se desea es contar las semanas propias del año en cuestion so El 1 de Enero no es Lunes, entonces corresponde a la ultima semana (52) del año anterior, otro problema con la solucion que planteas es:
5 de enero a que semana pertenece?
segun tu formula : 5/ene - 1/ene = 5 dias
Dividimos entre 7 : 5 / 7 = 0.714
Redondeamos hacia abajo : Math.floor(0.714) = 0
Como todos sabemos la semana 0 no existe en ningun calendario.
Por Otaku RzO el 21 de Junio de 2009
Por Lester Fibla Saavedr el 22 de Junio de 2009
http://es.wikipedia.org/wiki/ISO_8601
Por Lester Fibla Saavedr el 22 de Junio de 2009
Había escrito un comentario antes y al parecer no se guardó.
Bueno, en él decía que este tip tiene un grave error: el concepto de "primera semana", pues la primera semana del año en el calendario gregoriano no es la que contiene al 1 de enero, sino:
"La primera semana del año, la número 01, es la que contiene el primer jueves de enero. Las semanas de un año van de la 01 a la 52, salvo que el año termine en jueves, o bien en jueves o viernes si es bisiesto, en cuyo caso se añade una semana más: la 53."
http://es.wikipedia.org/wiki/Calendario_gregoriano
Por rafa el 06 de Julio de 2009
Por Lester Fibla Saavedr el 15 de Julio de 2009
http://es.wikipedia.org/wiki/Calendario_gregoriano
Saludos
Por facu el 17 de Julio de 2009
Por facu el 17 de Julio de 2009
http://board.flashkit.com/board/showthread.php?t=755170
y el algoritmo que la explica
http://www.tondering.dk/claus/cal/node8.html#SECTION00880000000000000000
Por NeoCesar el 01 de Septiembre de 2009
Gracias
Por Luis el 28 de Octubre de 2014