November 5, 2003

Computing days between dates

This version is not yet complete. We will finish it next class.



/*
Applet to compute the number of days between any two dates.
*/
import java.awt.*;
     import java.applet.Applet;
     import java.awt.event.*;
public class Days extends Applet implements ActionListener {
 // GUI Widgets
   TextField month1Text, day1Text, year1Text, month2Text, day2Text, year2Text;
   Button goButton;
   
   // Program variables
   int month1, day1, year1, month2, day2, year2;
   boolean valid;
   int days;
   
   public void init() {
   makeGui();
   
   valid = false;
   days = 0;
   } // init
   
   public void paint(Graphics g) {
      // print out the two dates
      g.drawString("Date 1:"+month1+"/"+day1+"/"+year1,   20, 120);
      g.drawString("Date 2:"+month2+"/"+day2+"/"+year2,   20, 140);
   
      if (valid) {
         // # of days between dates
         g.drawString("These dates are "+days+" days apart.", 20,   160);
      }
      else
         g.drawString("Please enter valid dates.", 20, 160);
   } // paint
   
   public void compute() {
      // count the number of days between m1/d1/y1 and m2/d2/y2
      days = 0;
   
      // see if the two dates are in the same year
      if (year1 == year2) {
         // see if they're in the same month
         if (month1 == month2) {
            days = day2 - day1;
         }
         else {	// /they're in different months
            // count the # days in month1
            days += daysInMonth(month1, year1) - day1;
   
            // add the #days in each month from month1+1..month2-1
            for (int m = month1+1; m <= month2-1; ++m) {
               days += daysInMonth(m, year1);
            }
            // add #days in month2
            days += day2;
         }
   
      }
      else
         {
         // the two dates are in different years
         // compute # days in year1
         // compute #days in month1
         days += daysInMonth(month1, year1) - day1;
   
         // add #days in month1+1..12
         for (int m=month1+1; m <= 12; ++m) {
            days += daysInMonth(m, year1);
         }
   
         // add #days in each year from year1+1..year2-1
         for (int y=year1+1; y < year2; ++y) {
            if (leapyear(y))
               days += 366;
            else
               days += 365;
         }
   
         // add #days in year2
         // compute #days in each month from 1..month2-1
         for (int m=1; m < month2; ++m) {
            days += daysInMonth(m, year2);
         }
   
         // add #days in month2
         days += day2;
      }
   } // compute
   
   
   public boolean isDateValid(int m, int d, int y) {
   // Check is the date is valid m/d/y
   
   if (y < 1900)
   return false;
   
   if (m < 1 || m > 12)
   return false;
   
   if (d < 1 || d > daysInMonth(m, y))
   return false;
   
   return true;
   } // isDateValid
   
   private int daysInMonth(int m, int y) { // returns the # days in month, m in   year y
   
   switch (m) {
   case 1:
   case 3:
   case 5:
   case 7:
   case 8:
   case 10:
   case 12: return 31;
   case 4:
   case 6:
   case 9:
   case 11: return 30;
   case 2: if (leapyear(y))
   return 29;
   else
   return 28;
   }
   return 0;
   } // daysInMonth
   
   private boolean leapyear(int y) {
   return (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0));
   } // leapYear
   
   private void readDate() {
   month1 = readValue(month1Text);
   day1 = readValue(day1Text);
   year1 = readValue(year1Text);
   
   month2 = readValue(month2Text);
   day2 = readValue(day2Text);
   year2 = readValue(year2Text);
   
   } // readDate
   
   
   private int readValue(TextField t) {
   String s;
   Integer i;
   
   // Get the text in textfield
   s = t.getText();
   
   // Convert it to Integer object
   i = new Integer(s);
   
   // gets its int value
   return i.intValue();
   } // readValue
   
   public void actionPerformed(ActionEvent e) {
   if (e.getSource()==goButton) {
   readDate();
   
   // validate dates
   valid = isDateValid(month1, day1, year1) && isDateValid(month2, day2,   year2);
   
   // compute days between dates
   //days = compute(m1, d1, y1, m2, d2, y2);
   compute();
   }
 repaint();
   } // actionPerformed
   
   private void makeGui() {
   Panel datePanel, mdy1Panel, mdy2Panel, allPanel, goPanel;
   Label date1L, m1L, d1L, y1L;
   Label date2L, m2L, d2L, y2L;
   
   setLayout(new BorderLayout());
   
   // Applet has 2 sets of three text fields for entering month/day/year for two   dates
   // Date 1
   datePanel = new Panel();
   datePanel.setLayout(new GridLayout(2,2));
   
   mdy1Panel = new Panel();
   mdy1Panel.setLayout(new GridLayout(2,3));
   
   m1L = new Label("Month");
   d1L = new Label("Day");
   y1L = new Label("Year");
   mdy1Panel.add(m1L);
   mdy1Panel.add(d1L);
   mdy1Panel.add(y1L);
   
   month1Text = new TextField(2);
   day1Text = new TextField(2);
   year1Text = new TextField(4);
   mdy1Panel.add(month1Text);
   mdy1Panel.add(day1Text);
   mdy1Panel.add(year1Text);
   
   mdy1Panel.setBackground(Color.orange);
 
   // Date2
   
   mdy2Panel = new Panel();
   mdy2Panel.setLayout(new GridLayout(2,3)); 
   
   m2L = new Label("Month");
   d2L = new Label("Day");
   y2L = new Label("Year");
   mdy2Panel.add(m2L);
   mdy2Panel.add(d2L);
   mdy2Panel.add(y2L);
   
   month2Text = new TextField(2);
   day2Text = new TextField(2);
   year2Text = new TextField(4);
   mdy2Panel.add(month2Text);
   mdy2Panel.add(day2Text);
   mdy2Panel.add(year2Text);
   
   mdy2Panel.setBackground(Color.magenta);
   
   date1L = new Label("Date 1");
   Panel date1P = new Panel();
   date1P.add(date1L);
   date1P.setBackground(Color.orange);
   
   date2L = new Label("Date 2");
   Panel date2P = new Panel();
   date2P.add(date2L);
   date2P.setBackground(Color.magenta);
   
   datePanel.add(date1P);
   datePanel.add(date2P);
   datePanel.add(mdy1Panel);
   datePanel.add(mdy2Panel);
   
   // applet has a Go Button
   goButton = new Button("Go");
   goPanel = new Panel();
   goPanel.add(goButton);
   goPanel.setBackground(Color.cyan);
   
   allPanel = new Panel();
   //allPanel.setLayout(new GridLayout(2,1));
   
   allPanel.add(datePanel);
   //allPanel.add(goPanel);
   
   add("South", goPanel);
   add("North", allPanel);
   
   // activate listener for go button
   goButton.addActionListener(this);
   } // makeGUI
} // Days
Back to CS110 Examples