JDK Tutorials - Herong's Tutorial Notes
Dr. Herong Yang, Version 4.32, 2006

Time and Calendar

Part:   1  2  3  

JDK Tutorials - Herong's Tutorial Notes © Dr. Herong Yang

Internationalization

Character Set and Encoding

Socket Communication

Document Object Model (DOM)

XSD Validation in Java

XSL - Transformer in Java

JCA - Private and Public Key Pairs

JCE - Secret Key

SSL (Secure Socket Layer)

SSL - Client Authentication

... Table of Contents

(Continued from previous part...)

The following program demontrates how the add() method works:

import java.util.*;
class DateOperationTest {
   public static void main(String[] a) {
      GregorianCalendar dt = new GregorianCalendar();
      dt.set(2002,9,31); //31-Oct-2002
      System.out.println("Current time: "+dt.getTime().toString());
      dt.add(Calendar.DATE,1);
      System.out.println("Add 1 to date: "+dt.getTime().toString());
      dt.set(2002,9,31); //31-Oct-2002
      System.out.println("Current time: "+dt.getTime().toString());
      dt.roll(Calendar.DATE,1);
      System.out.println("Roll 1 to date: "+dt.getTime().toString());
      dt.set(2002,9,31); //31-Oct-2002
      System.out.println("Current time: "+dt.getTime().toString());
      dt.add(Calendar.MONTH,1);
      System.out.println("Add 1 to month: "+dt.getTime().toString());
      
      GregorianCalendar dt1 = new GregorianCalendar();
      GregorianCalendar dt2 = new GregorianCalendar();
      dt1.set(2002,9,31,0,0,0);
      dt2.set(2002,10,1,0,0,0);
      System.out.println("     From: "+dt1.getTime().toString());
      System.out.println("       To: "+dt2.getTime().toString());
      long days = fullDayDiff(dt1,dt2);
      System.out.println("Full days: "+days);
      
      dt1.set(2002,9,31,0,0,0);
      dt2.set(2002,10,30,0,0,0);
      System.out.println("       From: "+dt1.getTime().toString());
      System.out.println("         To: "+dt2.getTime().toString());
      long months = fullMonthDiff(dt1,dt2);
      System.out.println("Full months: "+months);

      dt1.set(2002,9,30,0,0,0);
      dt2.set(2003,10,29,0,0,0);
      System.out.println("       From: "+dt1.getTime().toString());
      System.out.println("         To: "+dt2.getTime().toString());
      months = fullMonthDiff(dt1,dt2);
      System.out.println("Full months: "+months);
   }
   public static long fullDayDiff(Calendar dt1, Calendar dt2) {
      long tm1 = dt1.getTime().getTime();
      long tm2 = dt2.getTime().getTime();
      return (tm2-tm1)/(1000*60*60*24);
   }
   public static long fullMonthDiff(Calendar dt1, Calendar dt2) {
      // Both dates are truncated to the beginning of the day
      // dt1 and dt2 are damaged
      // 30-Oct-2002 to 30-Nov-2002: 1 month
      // 31-Oct-2002 to 30-Nov-2002: 1 month
      // 30-Oct-2002 to 29-Nov-2002: < 1 month
      Calendar a, b;
      if (dt1.before(dt2)) {
      	 a = dt1;
      	 b = dt2;
      } else {
         a = dt2;
         b = dt1;
      }
      
      // work on the years
      int y1 = a.get(Calendar.YEAR);
      int y2 = b.get(Calendar.YEAR);
      int m1 = a.get(Calendar.MONTH);
      int m2 = b.get(Calendar.MONTH);
      int l = y2 - y1;
      if (m2<m1) l--; 
      int diff = 0;
      if (l>0) {
         diff += l*12;
         a.add(Calendar.YEAR,l);
      }
      
      // work on the months
      y1 = a.get(Calendar.YEAR);
      y2 = b.get(Calendar.YEAR);
      m1 = a.get(Calendar.MONTH);
      m2 = b.get(Calendar.MONTH);
      if (m2<m1) {
      	 l = m2 + 12 - m1;
      } else {
         l = m2 - m1;
      }
      l = m2 - m1;
      if (l>0) {
      	 diff += l;
         a.add(Calendar.MONTH,1);
      }
      
      // date adjustment
      int d1 = a.get(Calendar.DATE);
      int d2 = b.get(Calendar.DATE);
      if (d2<d1) diff--;
      
      return diff;
   }
}

Output:

Current time: Thu Oct 31 19:02:19 EST 2002
Add 1 to date: Fri Nov 01 19:02:19 EST 2002
Current time: Thu Oct 31 19:02:19 EST 2002
Roll 1 to date: Tue Oct 01 19:02:19 EDT 2002
Current time: Thu Oct 31 19:02:19 EST 2002
Add 1 to month: Sat Nov 30 19:02:19 EST 2002
     From: Thu Oct 31 00:00:00 EST 2002
       To: Fri Nov 01 00:00:00 EST 2002
Full days: 1
       From: Thu Oct 31 00:00:00 EST 2002
         To: Sat Nov 30 00:00:00 EST 2002
Full months: 1
       From: Wed Oct 30 00:00:00 EST 2002
         To: Sat Nov 29 00:00:00 EST 2003
Full months: 12

Note that I have only done few tests on the fullMonthDiff() method. So don't take it to your program directly. Do more tests yourself.

Exercise: Write a program to calculate the annually compound interest of an investment with the following method signature:

   public static double getInterest(double capital, 
      double interest_rate, Calendar start_date, Calendar end_date)

Part:   1  2  3  

Dr. Herong Yang, updated in 2006
JDK Tutorials - Herong's Tutorial Notes - Time and Calendar