¿Quieres registrarte?

Cómo obtener el número de semana del año con Javascript

Por: NeoCesar
19 de Junio del 2009
508 de clabLevel
Otros artículos de NeoCesar
6,658 visitas

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


¿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

  1. Tenemos una fecha y no sabemos el numero de semana del año al que pertenece.

Sabemos

  1. Sabemos que el año tiene 52 semana.
  2. Que la semana empieza el Lunes.
  3. Que el año empieza el 1 de Enero.
  4. Que si el 1 de Enero no es Lunes entonces pertenece a la semana 52 del año anterior.
  5. Que a cada fecha le corresponde una marca de tiempo.
  6. Que las marcas de tiempo se operar matemáticamente ( + , - , * , / ).

Podemos

  1. Obtener la marca de tiempo del 1 de Enero del mismo año de la fecha en cuestión.
  2. Obtener la marca de tiempo de la fecha en cuestión.
  3. Compensar ambas fechas en caso que el 1 de Enero no sea Lunes.
  4. Restar ambas marcas de tiempo para obtener una nueva que represente al tiempo transcurrida entre ambas.
  5. 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 xD, espero les halla sido de mucha utilidad.

Enviar a twitter Enviar a facebook


También te interesa


Etiquetas javascript matematicas

Comentarios | Enviar un comentario
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 xD
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 (y)
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. xD
Por: NeoCesar
muy buen tip, no me la sabía. (y)
Por: Otaku RzO
Ah, se me olvidaba... eso está normado:
http://es.wikipedia.org/wiki/ISO_8601
Por: Lester Fibla Saavedra-blo
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."

http://es.wikipedia.org/wiki/Calendario_gregoriano
Por: Lester Fibla Saavedra-blo
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
Y si pues. Ahí dejé el link:
http://es.wikipedia.org/wiki/Calendario_gregoriano

Saludos
Por: Lester Fibla Saavedra-blo
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
aca hay una funcion que sigue la norma
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: facu-blog
Deja un comentario
IMPORTANTE

Recuerda ser respetuoso, no insultes a otras personas, ni uses palabrotas, hay una persona al otro lado de la pantalla.

Habla bien, NO ESCRIBAS EN MAYUSCULA TODO, no escribas como en un SMS, evita cosas como "ke", "x q" y demás abreviaciones.

Aquí funcionan las etiquetas de los foros, puedes usar [b] para negrita, [img] para las imágenes, [url] para los enlaces, etc.

Si tienes preguntas técnicas, envíalas mejor al foro.