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.
jajaja lo que mas me encanto es cómo hiciste el tuto, re didactico por cierto, no es un tema menor, el jueguito kadokado es por semanas Por:danyrik
NeoCesar :
Requerimientos
Sentido Común
Una pizca de concentración
juas! esos requerimientos habría que ponérselos a todos los tips jaja buen detalle Por:Zguillez
no seria mas facil contar cuantos dias pasaron desde el 1ero de enero del corriente. Y luego divido por 7, y le quito la parte de la coma (redondeo para abajo). :/ Por:Tom-blog
Tom-blog :
no seria mas facil contar cuantos dias pasaron desde el 1ero de enero del corriente. Y luego divido por 7, y le quito la parte de la coma (redondeo para abajo). :/
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:NeoCesar
Damn.
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."
no seria mas facil que alguien nos pase un link donde ya esten indicadas las semanas del ano?? porque gente como yo que al ver sus comentarios y formulas nos quedamos con una sonrisa de ignorancia y pensando en que no han de tener nada que hacer como para perder tiempo discutiendo formulas para algo que deberia de ser mas sencillo, no creen Por:rafa-blog
man, estas bardeando un toque, no estan agarrar los 365/6 dias del anio y cortarlos en 7 y mandarle segun te paresca un numero a cada semana, hay toda una norma http://en.wikipedia.org/wiki/ISO_week_date Por:facu-blog