Also available as tomorrow.java

/**
 * Uses a calendar object to figure out about tomorrow 
 * and print out the date and day of the week.
 */

import java.util.*;

public class tomorrow {

    /**
     *  define an array of strings that can translate between integer
     *  DAY_OF_WEEK and strings. Sunday is the first day of the week for
     *  the GregorianCalendar (although this can be changed).
     *  Note: The DAY_OF_WEEK value used by Calendar objects start at 1, 
     * (and our array of strings starts at 0)!
     */
 
    final static String[] DAYS ={ "Sunday",
                                  "Monday",
                                  "Tuesday",
                                  "Wednesday",
                                  "Thursday",
                                  "Friday",
                                  "Saturday" };

    /**
     *  define an array of strings that can translate between integer
     *  MONTH and strings. According to a Calendar object, the first
     *  month (January) is month 0.
     */

    static final String[] MONTHS = { "January",
                                     "February",
                                     "March",
                                     "April",
                                     "May",
                                     "June",
                                     "July",
                                     "August",
                                     "September",
                                     "October",
                                     "November",
                                     "December"};

    /**
     * main can handle a month day and year specified on the command
     * line (all as integers). If it find acceptable values onthe
     * command line this program uses today's date.
     *
     * main figures out the date for the following day, and prints it out.
     */

    static public void main(String []args) {
        // Create a calendar object holding today's date
        Calendar c = Calendar.getInstance();
        // if there are command line args, change the Calendar 
        // object to hold the date specified by the month,day and year
        try {
            int month,day,year;
            month = Integer.parseInt(args[0]);
            day = Integer.parseInt(args[1]);
            year = Integer.parseInt(args[2]);

            // January is month 0 !
            c.set(Calendar.MONTH,month-1);
            c.set(Calendar.YEAR,year);
            c.set(Calendar.DATE,day);
        } catch( Exception e) {
            // invalid or missing command line args, just
            // assume we should use the current month,year.
            // This is already in the Calendar object!
        } 

        // This version explicitly looks at the current date to
        // determine whether the following day is in a new month
        // and year. Look at bettertomorrow.java for a better way to
        // do this (the Calendar object will take care of this for us!).

        // is this the last day of the month?
        if (c.get(Calendar.DAY_OF_MONTH)==daysInMonth(c)) {
            // yes - tomorrow is a new month
            // is tomorrow also a new year?
            if (c.get(Calendar.MONTH)==c.getActualMaximum(Calendar.MONTH)) {
                // yes - new year!
                // change the month to the minimum valid value.
                c.set(Calendar.MONTH,c.getActualMinimum(Calendar.MONTH));

                // change the year to be the current year plus 1
                c.set(Calendar.YEAR,c.get(Calendar.YEAR)+1);
            } else {
                // new month only - change to the month plus 1
                c.set(Calendar.MONTH,c.get(Calendar.MONTH)+1);
            }
            // the date needs to change to the smallest valid date
            // (should be 1!
            c.set(Calendar.DATE,c.getActualMinimum(Calendar.DATE));

        } else {
            // new day only (not a new month)
            c.set(Calendar.DATE,c.get(Calendar.DATE)+1);
        }

        // the Calendar object now has all the date fields set to
        // represent tomorrow. Print this day out.

        System.out.println("Tomorrow is " + 
                           dayName(c) + " " + 
                           monthName(c) + " " +
                           c.get(Calendar.DATE) + ", " +
                           c.get(Calendar.YEAR));
    }        

    /**
     * daysInMonth looks up the number of days in the current month
     * in a Calendar object. This takes care of leap year for us!
     * @param c is the Calendar object holding the date we want to
     *          find out about.
     * @return the number of days in the month. 
     */
    static int daysInMonth( Calendar c) {
        return(c.getActualMaximum(Calendar.DAY_OF_MONTH));
    }


    /**
     * dayName looks up the string version of the day of the week
     * for the date in a Calendar object
     * @param c the Calendar object holding the date
     * @return an string holding the (english) day of the week
     */

    static String dayName( Calendar c) {
        // Need to subtract 1, since the first DAY_OF_WEEK is 1 !
        return(DAYS[c.get(Calendar.DAY_OF_WEEK)-1]);
    }        

    /**
     * monthName looks up the string version of the month
     * for the date in a Calendar object
     * @param c the Calendar object holding the date
     * @return an string holding the (english) month
     */

    static String monthName(Calendar c) {
        return(MONTHS[c.get(Calendar.MONTH)]);
    }
  

}