semana del año en Java

En esta ocasión estamos creando el algoritmo definido por la ISO 8601 para poder poner el día de la semana en la que nos encontramos.

public class SemanaAnno{
	public Integer semanaAnno(Calendar fecha){
		//conseguimos el dia de año, un año tiene 365 dias... 366 si es bisiesto.
		Calendar cal = new GregorianCalendar();
		int mes = cal.get(fecha.MONTH)+1;
		int a = mes==1||mes==2?cal.get(fecha.YEAR)-1:cal.get(fecha.YEAR);
		int b = (a/4)-(a/100)+(a/400);
		int c = ((a-1)/4)-((a-1)/100)+((a-1)/400);
		int s = b-c;
		int e = mes==1||mes==2?0:s+1;
		int f;
		if(mes==1||mes==2){
			f=cal.get(fecha.DAY_OF_MONTH)-1+(31*(mes-1));
		}else{
			f=cal.get(fecha.DAY_OF_MONTH)+((153*(mes-3)+2)/5)+58+s;
		}
		int g = (a+b)%7;
		int d = (f+g-e)%7;
		int n = f+3-d;
		if(n<0){//Corresponde al año anterior
			return (53-((g-s)/5));
		}else if(n>364+s){//Corresponde al año siguiente
			return 1;//corresponde al año siguiente
		}else{//corresponde al año en curso.
			return (n/7)+1;
		}
	}
}

Como seguro que os lo vais a preguntar ya lo cuento de antemano, las variables no son nemotécnica por que realmente no se muy bien que es lo que estamos haciendo en cada paso, lo cual supone un gran fallo para cualquier programador, pero la verdad es que este "trabajito" ya me estaba trayendo por la calle de la amargura, no he conseguido encontrar el ISO 8601 en toda su extensión, solamente pequeñas pretensiones que indicaban el tipo de formateo permitido por la ISO, la verdad es que eso me sirvió de poco.

Las paginas que encontré con el calculo eran solamente aproximaciones que yo ya había probado, desde contar los días hasta contar el día total en el que estamos en el año, vamos lo que viene a ser el día Juliano, sumarle el día en que comenzó la semana, cosa que ya hemos calculado antes, vamos que funcionar funcionaba, pero que pasaba cuando decías de contar el 1 de Enero de cualquier año, pocas veces coincide que la semana del 1 comience en lunes, por lo que las cuentas solo salían para ciertos meses y para ejemplo un botón, el 1 de Enero del 2012 es el domingo de la semana 52 del año 2011, según nuestro recuento que pasaría,  como ha comenzado el año en domingo le sumamos cinco, se suman cinco por que la semana la iniciamos en lunes, 6/7 el mod de esta división nos daría un total de 0, se puede realizar una división normal ya que estamos dividiendo enteros y asignándoselo a enteros. Muy bien y vosotros diréis, pues ya esta si es 0 se corresponde a la ultima del año anterior, pero esto ya seria regresivo, tendríamos que volver a hacer todo pero con el 31 de Diciembre del año anterior. Pero que paso en Enero del 2009, según las cuentas hasta el día 5 no podemos marcar la primera semana del año, esto se trataría de otra excepción, por que si buscamos los calendarios de esos años nos encontraremos que la primera semana del año fue la misma que contenía el día uno.

Con el código que aquí comparto todos estos datos quedan cubiertos dando en definitiva el día exacto, igual me hacen falta más pruebas comparando con los calendarios de otros años, pero en un principio y por las pruebas realizadas este código es correcto.

El código original del que me he basado es un JavaScript que encontré en la red, lamento no poder dar referencias pero es que no me acuerdo, me lo copie en el NotePad++ y se me olvido guardar la pagina en favoritos, realmente deseo que les guste el aporte y les pueda resultar útil.