//====================================================================
// Example of dates using the Date class only
//====================================================================
import java.util.Date;

public class Date1 {

    private static void prt() {
        System.out.println();
    }
    private static void prt(String s) {
        System.out.println(s);
    }

    public static void main(String[] args) {

        //To create a Date object for the current date and time 

        prt("Current date and time");
        prt("======================================================================");
        Date now = new Date();
        prt("new Date().............: " + now);                 //now.toString()
        prt();                                                  //Day Mth dd hh:mm:ss TZ yyyy


        //To create a Date object for a different date/time
        //provide the number of milliseconds since 1/1/1970 as datatype long

        prt("Date object for a specific date/time");
        prt("======================================================================");
        long oneDay = 24*60*60*1000;                           //one day in milliseconds  
        Date date0  = new Date(0);
        Date date1  = new Date(oneDay);
        Date date2  = new Date(17358 * oneDay);
        prt("Epoch date............: "         + date0);
        prt("First day after that..: "         + date1);
        prt("Date(" + 17358*oneDay + ") is: "  + date2);       //Sun Jul 9 20:00:00 EST 2017
        prt();


        //Get the number of seconds using getTime()

        prt("How many milliseconds have elapsed since 1/1/1970");
        prt("======================================================================");
        long start = date0.getTime();                   //returns num of millisec since 1/1/1970
        long end   = now.getTime();
        prt("start 'epoch'..........: " +  start);
        prt("now in milliseconds....: " +  end);
        prt("elapsed................: " + (end-start));
        float days = (float) (end-start)/oneDay;        //cast to float
        prt("elapsed in days........: " + days);
        prt();


        //Compare 2 dates.  Result: 0=equal, -1=smaller, 1=larger
        
        prt("Compare 2 dates.  Result: 0=equal, -1=smaller, 1=larger");
        prt("======================================================================");
        int x = now.compareTo(date0);
        prt("Epoch...................: " + date0); 
        prt("Current date (now)......: " + now); 
        prt("now compareTo Epoch is..: " + x);              //now is greater, prints 1
        prt();

        
        //Compute the number of days between 2 days
 
        prt("Number of Days in between date1 and date2");
        prt("===============================================================");
        float diff = dateDiff(now, date0);
        prt("Num of days in between.: " + diff);
        prt();


        //Add (or subtract) a number of days from a Date

        prt("Add a number of days to a given Date");
        prt("===============================================================");
        Date date5 = new Date();
        Date date6 = dateAdd(now, 100);
        prt("100 days from today is.: " + date6);
        prt();
    }


    //--------------------------------------------------------------------------------------------------
    //Determine the number of days in between 2 dates
    //--------------------------------------------------------------------------------------------------
    public static float dateDiff(Date d1, Date d2) {
    
        long oneDay    = 24*60*60*1000;         //one day in milli-seconds
        long milliSec1 = d1.getTime();          //get number of milliseconds for day 1 
        long milliSec2 = d2.getTime(); 

        float diff     = (milliSec1 - milliSec2);   
              diff     = diff / oneDay;         //divide diff by num of milliseconds per day 
                  
        return(diff);
    }                

    //--------------------------------------------------------------------------------------------------
    //Add or subtract a number of days to a given Date
    //--------------------------------------------------------------------------------------------------
    public static Date dateAdd(Date d, int days) {
                                                                
        long oneDay    = 24*60*60*1000;                 //one day in milli-seconds
        long millisec  = d.getTime();                   //get number of milli seconds
             millisec += days * oneDay;                 //add days x number of millisec per day
             
        Date newDate = new Date(millisec);              //create a new date object
                          
        return(newDate);
    }                
}