¿En que día de la semana vivimos? escrito en Java


Basándome en los datos extraídos de la Wikipedia  he confeccionado la función necesaria para saber si nos encontramos a martes o a miércoles.

Lo primero que se tiene que hacer es cargar unas contantes, la primera fila corresponde a los días de la semana, se coloca como primer día el domingo por que es el séptimo día de la semana y lógicamente cuando se calcula el resto dividiendolo entre siete da cero.
La segunda fila es un array de arrays de integer, estos campos son calculables, pero son unos datos constantes de manera que no los meto en la función por la carga de proceso, que no seria muy grande, pero si el código lo llevamos a un proyecto más grande este se puede resentir por tanto calculo. De todos modos el calculo es muy sencillo, es el modulo de la suma de los módulos del máximo de días de los meses, o lo que es lo mismo si hablamos de marzo seria (31%7 + 28%7 + 31%7)%7, en año bisiesto seria (31%7 + 29%7 + 31%7)%7, siempre es lo mismo por eso no vale la pena y lo cargo en un método estático.

//Se cargan los datos que seran constantes durante todo el proceso.
public static final String[] diaSemana = {"Domingo", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado"};
public static final int[][]modulos = {{0,3,3,6,1,4,6,2,5,0,3,5},{0,3,4,0,2,5,0,3,6,1,4,6}};

Despues el metodo que hace falta para hacer el caculo seria:

public int calculoDia(Calendar fecha){
	//Generamos las variables necesarias
	AnnoBisiesto annoBisiesto = new AnnoBisiesto();//La clase que nos calculara si el año es bisiesto o no.
	Calendar c = new GregorianCalendar();//necesario para convertir los datos a fecha actual
	int diaSemana; //sera el dia que devolvemos 0 = Domingo
	int mM; // es el modulo del mes, es un dato calculable pero al ser constante lo pongo como estatico.
	int year = c.get(fecha.YEAR);//El año
	int dia = c.get(fecha.DAY_OF_MONTH);//El dia al que estamos
	int sum1, sum2, sum3, temp1, temp2, temp3;//creamos tres de las cuatro sumas. Los temporales hacen falta ya que no se cuenta el resto de las divisiones
	//miramos si el año es bisiesto para asignar 0 o 1, necesario para la seleccion del array
	int bisiesto = annoBisiesto.AnnoBisiestoGood(fecha)?1:0;
	//extraemos el modulo que se utilizara para la suma total
	mM = modulos[bisiesto][c.get(fecha.MONTH)];
	//El tratamiento son cuatro sumas de cuatro modulos de 7
	//la formula seria
	//((A-1)%7+((A-1/4)-(3*((A-1/100)+1)/4))%7+DM%7+D%7)%7
	//donde A=año, DM=Dias transcurridos hasta antes del primer dia del mes, D=dia, % = Modulo y en todas las divisiones solo se consideran las cifras enteras.
	sum1 = (year-1)%7;
	temp1 = (year - 1)/4;
	temp2 = (year - 1)/100;
	temp3 = ((temp2+1)*3)/4;
	sum2 = (temp1 - temp3)%7;
	sum3 = dia%7;
	diaSemana = (sum1 + sum2 + mM + sum3)%7;
	return diaSemana;
}

Recordemos que la división de dos enteros da como resultado un long, por eso utilizo los temporales, para que se eliminen los restos y trabaje solamente con enteros tras una división. Recordemos también que la función "annoBisiesto.AnnoBisiestoGood" esta escrita en la anterior publicación de este blog, por si alguno no sabe como calcular el año bisiesto.

Y con este código tenemos el calculo completo de en que día vivimos.