package com.taringamberini.util.date.test;

import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;



/**
 * <p>
 * Calcola i giorni di differenza fra un giorno ed il giorno immediatamente
 * successivo. Il calcolo è ripetuto per tutte le coppie successive di date dal
 * 01/01/2003 alla 31/12/2006.
 * </p>
 * 
 * @author Tarin Gamberini - www.taringamberini.com
 */
public class DifferenzaDate1 {

	/**
	 * <p>
	 * Calcola i giorni di differenza nell'intervallo ] dallaDataGC, allaDataGC ].
	 * </p>
	 * 
	 * @param dallaDataGC
	 * @param allaDataGC
	 * @return Una stringa contenete i giorni fra due date calcolati con la
	 *         divisione intera, con la divisione reale e con l'arrotondamento
	 *         della divisione reale.
	 */
	public String giorniFraDueDate( GregorianCalendar dallaDataGC, GregorianCalendar allaDataGC ) {

		// conversione in millisecondi
		long dallaDataMilliSecondi = dallaDataGC.getTimeInMillis();
		long allaDataMilliSecondi = allaDataGC.getTimeInMillis();

		long millisecondiFraDueDate = allaDataMilliSecondi - dallaDataMilliSecondi;

		// conversione in giorni con la divisione intera
		double giorniFraDueDate_DivInt = millisecondiFraDueDate / 86400000;
		
		// conversione in giorni con la divisione reale
		double giorniFraDueDate_DivReal = millisecondiFraDueDate / 86400000.0;

		// conversione in giorni con arrotondamento della divisione reale
		double giorniFraDueDate_DivRealRound = Math.round( millisecondiFraDueDate / 86400000.0 );

		return giorniFraDueDate_DivInt + "\t" + 
				giorniFraDueDate_DivReal + "\t" + 
				giorniFraDueDate_DivRealRound;
	}

	/**
	 * <p>
	 * Calcola i giorni di differenza fra un giorno ed il giorno immediatamente
	 * successivo. Il calcolo è ripetuto per tutte le coppie successive di date
	 * dal 01/01/2003 alla 31/12/2006.
	 * </p>
	 * <p>
	 * Interessanti i risultati nei giorno di cambio fra ora solare/legale e
	 * legale/solare:
	 * <p>
	 * <ul>
	 * <li>] 30/03/2003, 31/03/2003 ]</li>
	 * <li>] 26/10/2003, 27/10/2003 ]</li>
	 * <li>] 28/03/2004, 29/03/2004 ]</li>
	 * <li>] 31/10/2004, 01/11/2004 ]</li>
	 * <li>] 27/03/2005, 28/03/2005 ]</li>
	 * <li>] 30/10/2005, 31/10/2005 ]</li>
	 * <li>] 26/03/2006, 27/03/2006 ]</li>
	 * <li>] 29/10/2006, 30/10/2006 ]</li>
	 * </ul>
	 */
	public DifferenzaDate1() {
		SimpleDateFormat sdf = new SimpleDateFormat( "dd/MM/yyyy" );

		// dalla data
		GregorianCalendar dallaDataGC = new GregorianCalendar( 2003, GregorianCalendar.JANUARY, 1 );
		// alla data
		GregorianCalendar allaDataGC = new GregorianCalendar( 2003, GregorianCalendar.JANUARY, 2 );

		System.out.println( "]  dallaData,   allaData ]\t" + "int" + "\t" + "real" + "\t" + "round" );
		while ( !sdf.format( allaDataGC.getTime() ).equals( "31/12/2006" ) ) {

			// calcolo i giorni di differenza fra due date
			String numGiorni = giorniFraDueDate( dallaDataGC, allaDataGC );
			
			System.out.println( "] " + 
					sdf.format( dallaDataGC.getTime() ) + ", " + 
					sdf.format( allaDataGC.getTime() ) + " ]\t" + 
					numGiorni );

			// incremento di un giorno l'intervallo ]dallaData, allaData]
			dallaDataGC.add( GregorianCalendar.DATE, 1 );
			allaDataGC.add( GregorianCalendar.DATE, 1 );
		}
	}

	public static void main( String[] args ) {
		new DifferenzaDate1();
	}

}

