Comunidad de diseño web y desarrollo en internet

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

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

  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.

¿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.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate