Estaba leyendo mi anterior tip de Cómo obtener el número de semana del año con Javascript. Revisando los comentarios encontré que había un gravísimo error en cuanto a no seguir los estándares para medición de tiempo, esta vez vuelvo a postear el tip corrigiendo este error garrafal.
Obtener el número de semana del año de una fecha actual con Javascript (ISO compatible)
Tal como acote en el tip original no existe (aún) una función nativa de Javascript que nos calcule el número de la semana del año de una fecha dada, ya que esta función no existe no nos queda de otra que implementarla a mano, esta vez siguiendo el estándar para medición de tiempo ISO8601 que más o menos dicen algo como:
Extraido de Wikipedia
Las explicaciones del proceso volitivo pueden verlas en el tip original, haciendo claro la salvedad que la primera semana del año no es la que contiene al 01 e enero necesariamente si no la que contiene al primer jueves del año.
La mejor solución que encontré corresponde a un algoritmo que me hicieron llegar como respuesta al tip original y que adapte para Javascript.
Dicho todo esto pasemos a ver la solución que humildemente os propongo:
Código :
function semanaISO($fecha){ if($fecha.match(/\//)){ $fecha = $fecha.replace(/\//g,"-",$fecha); //Permite que se puedan ingresar formatos de fecha ustilizando el "/" o "-" como separador }; $fecha = $fecha.split("-"); //Dividimos el string de fecha en trozos (dia,mes,año) $dia = eval($fecha[0]); $mes = eval($fecha[1]); $ano = eval($fecha[2]); if ($mes==1 || $mes==2){ //Cálculos si el mes es Enero o Febrero $a = $ano-1; $b = Math.floor($a/4)-Math.floor($a/100)+Math.floor($a/400); $c = Math.floor(($a-1)/4)-Math.floor(($a-1)/100)+Math.floor(($a-1)/400); $s = $b-$c; $e = 0; $f = $dia-1+(31*($mes-1)); } else { //Calculos para los meses entre marzo y Diciembre $a = $ano; $b = Math.floor($a/4)-Math.floor($a/100)+Math.floor($a/400); $c = Math.floor(($a-1)/4)-Math.floor(($a-1)/100)+Math.floor(($a-1)/400); $s = $b-$c; $e = $s+1; $f = $dia+Math.floor(((153*($mes-3))+2)/5)+58+$s; }; //Adicionalmente sumándole 1 a la variable $f se obtiene numero ordinal del dia de la fecha ingresada con referencia al año actual. //Estos cálculos se aplican a cualquier mes $g = ($a+$b)%7; $d = ($f+$g-$e)%7; //Adicionalmente esta variable nos indica el dia de la semana 0=Lunes, ... , 6=Domingo. $n = $f+3-$d; if ($n<0){ //Si la variable n es menor a 0 se trata de una semana perteneciente al año anterior $semana = 53-Math.floor(($g-$s)/5); $ano = $ano-1; } else if ($n>(364+$s)) { //Si n es mayor a 364 + $s entonces la fecha corresponde a la primera semana del año siguiente. $semana = 1; $ano = $ano+1; } else { //En cualquier otro caso es una semana del año actual. $semana = Math.floor($n/7)+1; }; return $semana+"-"+$ano; //La función retorna una cadena de texto indicando la semana y el año correspondiente a la fecha ingresada };
Cabe resaltar que este algoritmo solo funciona para semanas del calendario gregoriano y para otro tipo de calendarios (Juliano, Egipcio, Maya, etc.).
El algoritmo original en el que se basa este script fue desarrollado por Claus Tøndering en el 2002.
Espero les sea de 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 Freddie el 04 de Septiembre de 2009
Por Freddie el 04 de Septiembre de 2009
Por Macamba el 04 de Septiembre de 2009
---------------------------------------
function Num_Week()
{
fecha = new Date();
f2 = new Date(fecha.getFullYear(),fecha.getMonth(),fecha.getDate(),0,0);
f1 = new Date(fecha.getFullYear(),0,1,0,0);
day = f1.getDay();
if(day == 0)
day = 7;
if(day <5)
{
FW = parseInt(((Math.round(((f2-f1)/1000/60/60/24))+(day-1))/7) + 1);
if(FW == 53 || FW == 0)
FW = 1;
}
else
{
FW = parseInt(((Math.round(((f2-f1)/1000/60/60/24))+(day-1))/7));
if(FW == 0)
FW = 52;
if(FW == 53)
FW = 1;
}
return(FW);
}
WScript.echo(Num_Week());
Por Fernando el 09 de Septiembre de 2009
http://blog.funciton.com/2009/09/get-current-week-of-the-year.html
Por Macamba el 26 de Septiembre de 2009
"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."
Extraido de Wikipedia
--------------------------------------
WScript.echo(FW());
function FW()
{
fecha = new Date();
month = fecha.getMonth();
date = fecha.getDate();
f1 = new Date(fecha.getFullYear(),0,1,0,0);
dayf1 = f1.getDay();
if(dayf1 == 0)
dayf1 = 7;
f2 = new Date(fecha.getFullYear(),month,date,0,0);
dayf2 = f2.getDay();
if(dayf2 == 0)
dayf2 = 7;
if(month == 0 && date == 1 && dayf2 > 4 || month == 0 && date == 2 && dayf2 > 5 || month == 0 && date == 3 && dayf2 == 7)
{
f1 = new Date(fecha.getFullYear()-1,0,1,0,0);
f2 = new Date(fecha.getFullYear()-1,11,31,0,0);
dayf1 = f1.getDay();
if(dayf1 == 0)
day = 7;
}
if(month == 11 && date == 31 && dayf2 < 4 || month == 11 && date == 30 && dayf2 < 3 || month == 11 && date == 29 && dayf2 == 1)
return 1;
if(dayf1 <5)
FW = parseInt(((Math.round(((f2-f1)/1000/60/60/24))+(dayf1-1))/7) + 1);
else
FW = parseInt(((Math.round(((f2-f1)/1000/60/60/24))+(dayf1-1))/7));
return FW;
}
--------------------------------------
Guardar el contenido con el bloc de notas y despues cambiar la extension de *.txt a *.js
Por delmi el 12 de Mayo de 2010
Por NeoCesar el 12 de Mayo de 2010
Por JordiSall el 04 de Enero de 2011
Se basa en buscar que día de la semana es el 1 de enero de la fecha buscada y utilizarlo añadiendo una constante para calcular el numero de semanas desde ese mismo 1 de enero a la fecha buscada.
En caso de que el valor sea menor de 1 utilizamos la misma funcion para calcular la ultima semana del año anterior.
Option Explicit
Function NumeroSemana(Fecha As Date) As Integer
Dim E1 As Date
Dim D1 As Integer
E1 = Format("01/01/" & Year(Fecha))
D1 = Weekday(E1, vbMonday) - 1
NumeroSemana = Int((Fecha - E1 + D1) / 7)
If NumeroSemana < 1 Then
NumeroSemana = NumeroSemana(Format("31/12/" & Year(Fecha) - 1))
End If
End Function
Por juanpa el 10 de Mayo de 2011
Por NeoCesar el 10 de Mayo de 2011
Por tenemos un problema el 17 de Mayo de 2011
Por NeoCesar el 17 de Mayo de 2011
Código :
Por OscarSolano el 24 de Agosto de 2011
Por John el 27 de Octubre de 2011
pero me haz ahorrado el tiempo, lo adopte en otro lenguaje y luego de un corto analisis salio todo ok
Gracias
Por Dotto el 09 de Enero de 2013
Gracias
Por kode el 31 de Enero de 2013
Por Cristian S. el 07 de Diciembre de 2016
De antemano agradezco cualquier aporte.
Por NeoCesar el 07 de Diciembre de 2016
Si gustas usar la notación inglesa donde la semana empieza en domingo resta 1 día más y suma 1 día menos.
Espero haber sido de ayuda.
Por rahosudce el 07 de Enero de 2018
Antes que nada una disculpa por despertar a este sleeper jeje.
Bueno, la cosa es que no se si a PHP le suda la norma ISO-8601 o hay excepciones de fechas que entran en conflicto, lo anterior lo digo pues tengo resultados distintos al obtener el numero de semana de esta fecha en concreto: "04/enero/2016" o "04/01/2016"
Código :
Código :
Algún erudito que sepa que diablos?
Saludos!