martedì 4 dicembre 2012

Calcolare il giorno della settimana di un determinato anno

Si può applicare questa formula per calcolare il giorno della settimana dalla data:

x = N + (q)(N - 1) : 4 - (q)(N - 1) : 100 + (q)(N - 1) : 400 + t

Dove
N = anno corrente
q =  resto della divisione
t =  numero giorni trascorsi dall'inizio dell'anno in questione alla data presa in considerazione

Questa formula vale per qualsiasi data successiva al 15/10/1582.
Sotto una veloce implementazione in una classe Java:


import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class GetGiornoSettimana {

	/**
	 * x = N + (q)(N - 1) : 4 - (q)(N - 1) : 100 + (q)(N - 1) : 400 + t
	 * @param args
	 */
	public static void main(String[] args) {
		GetGiornoSettimana g=new GetGiornoSettimana();
		System.out.println(g.getGiornoSettimana(new Date()));
        System.out.println(g.getGiornoSettimana(20, 4, 1978));
       
	}
	private boolean isLeapYear(int anno){
		GregorianCalendar gc=new GregorianCalendar();
		return gc.isLeapYear(anno);
	}
	public String getGiornoSettimana(int giorno,int mese,int anno){
		return getGiornoSettimana(creaData(giorno, mese, anno));
	}
    public  String getGiornoSettimana(Date data){
    	String retVal="";
    	int anno=getAnnoDaData(data);
    	int val1=anno+getPrimoElemento(anno);
    	int giorniTrascorsi=getGiorniFromInizioAnno(data);
    	int r=val1+giorniTrascorsi;
    	int resto=r%7;
    	switch(resto){
    	case 0:
    		retVal="sabato";
    		break;
    	case 1:
    		retVal="domenica";
    		break;
    	case 2:
    		retVal="lunedi";
    		break;
    	case 3:
    		retVal="martedi";
    		break;
    	case 4:
    		retVal="mercoledi";
    		break;
    	case 5:
    		retVal="giovedi";
    		break;
    	case 6:
    		retVal="venerdi";
    		break;
    		
    	}
    	return retVal;
    }
    private int getPrimoElemento(int anno){
    	return getElemento(anno-1, 4)-getElemento(anno-1, 100)+getElemento(anno-1, 400);
    }
    private int getElemento(int anno,int div){
    	int r=(int)Math.floor((double)anno/(double)div);
    	System.out.println(r);
    	return r;
    }
    private int getGiorniFromInizioAnno(Date d){
    	int anno=getAnnoDaData(d);
    	boolean bisestile=isLeapYear(anno)?true:false;
    	int retVal=0;
    	int mese=getMeseDaData(d);
    	int giorno=getGiornoDaData(d);
    	for(int i=1;i<mese;i++){
    		switch(i){
    		case 2:
    			retVal+=bisestile?29:28;
    		 break;
    		case 4:
    		case 6:
    		case 9:
    		case 11:
    			retVal+=30;
    		 break;
    		default:
    			retVal+=31;
    		 break;
    		}
    	}
    	retVal+=giorno;
    	return retVal;
    }
    private int getAnnoDaData(Date data){
    	Calendar c=Calendar.getInstance();
    	c.setTime(data);
    	return c.get(Calendar.YEAR);
    }
    private int getMeseDaData(Date data){
    	Calendar c=Calendar.getInstance();
    	c.setTime(data);
    	return c.get(Calendar.MONTH)+1;
    }
    private int getGiornoDaData(Date data){
    	Calendar c=Calendar.getInstance();
    	c.setTime(data);
    	return c.get(Calendar.DAY_OF_MONTH);
    }
    private Date creaData(int giorno,int mese,int anno){
        Calendar c=Calendar.getInstance();
        c.set(Calendar.YEAR, anno);
        c.set(Calendar.MONTH, mese-1);
        c.set(Calendar.DAY_OF_MONTH, giorno);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    } 
   
}




Nessun commento:

Posta un commento