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.
0 comentarios: (+add yours?)
Publicar un comentario