Holidays.java Source code

Java tutorial

Introduction

Here is the source code for Holidays.java

Source

//** Copyright Statement ***************************************************
//The Salmon Open Framework for Internet Applications (SOFIA)
// Copyright (C) 1999 - 2002, Salmon LLC
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2
// as published by the Free Software Foundation;
// 
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// 
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
// 
// For more information please visit http://www.salmonllc.com
//** End Copyright Statement ***************************************************

//
//
//    Author: Gregory N. Mirsky
//    Updated: John D. Mitchell
//    Version 1.02
//

import java.util.Calendar;

public class Holidays {

    //*********************************
    // Miscellaneous other holidays are left as an exercise for the reader.
    //
    // public static Date QuebecCivicHoliday (int nYear)
    // {
    //  // 03 January YYYY
    // }
    //
    // public static Date AshWednesday (int nYear)
    // {
    //  // 42 days before easter...
    // }
    //
    // public static Date PalmSunday (int nYear)
    // {
    //  // Sunday before Easter Sunday...
    // }
    //
    // public static Date MaundayThursday (int nYear)
    // {
    //  // Thursday before Easter...
    // }
    //
    //  public static Date RoshHashanah(int nYear)
    // {
    //  Source: William H. Jefferys, Department of Astronomy, University of
    //  Texas Austin, TX 78712 
    //
    //         http://quasar.as.utexas.edu
    //
    //  First, calculate the Golden Number G. This is fundamental to the
    //  calculation of both the date of Easter and the Date of Rosh Hashanah. 
    //  It is intimately connected with the Metonic Cycle. For any year Y, the
    //  Golden Number is defined as 
    //
    //  G = Remainder(Y|19) + 1. Don't forget to add the 1!!!
    //
    //  The following rules are also due to John Horton Conway, of Princeton
    //  University. In the Gregorian year Y of the Common Era, Rosh Hashanah
    //  normally falls on September N, where
    //
    //  N + fraction = {[Y/100] - [Y/400] - 2} +
    //  765433/492480*Remainder(12G|19) + Remainder(Y|4)/4 - (313Y+89081)/98496
    //
    //  Here, G is the Golden Number, and * means multiply. However, if certain
    //  conditions are satisfied, Rosh Hashanah is postponed by one or even two
    //  days, as follows: 
    //
    //      ***Postponement rules***
    //
    //  1.If the day calculated above is a Sunday, Wednesday, or Friday, Rosh
    //  Hashanah falls on the next day (Monday, Thursday or Saturday,
    //  respectively).
    //
    //  2.If the calculated day is a Monday, and if the fraction is greater
    //  than or equal to 23269/25920, and if Remainder(12G|19) is greater than
    //  11, Rosh Hashanah falls on the next day, a Tuesday.
    //
    //  3.If it is a Tuesday, and if the fraction is greater than or equal to
    //  1367/2160, and if Remainder(12G|19) is greater than 6, Rosh Hashanah
    //  falls two days later, on Thursday (NOT WEDNESDAY!!).
    // }
    //
    //  public static Date Passover(int nYear)
    // {
    //  Source: William H. Jefferys, Department of Astronomy, University of
    //  Texas Austin, TX 78712
    //
    //         http://quasar.as.utexas.edu
    //
    //  Once you have determined the date of Rosh Hashanah, it is easy to
    //  calculate the date of Passover in the same (Gregorian or Julian)
    //  year. Let M = the number of days from September 6 to Rosh Hashanah.
    //  In the example for 1996, M=September 14-September 6 = 8 days.
    //
    //  Count M days from March 27. That is the date of Passover. It actually
    //  begins at sundown on the previous evening. In the example for 1996, 8
    //  days after March 27 is April 4 (there are 31 days in March), so
    //  Passover begins at sundown on April 3.
    // }
    //
    // public static Date DominionDay (int nYear)
    // {
    //  // 01 July YYYY
    // }
    //
    // public static Date BoxingDay (int nYear)
    //  {
    //  // Day after Christmas, December 26th...
    //  }
    //
    //*********************************************

    public static java.util.Calendar AbrahamLincolnsBirthday(int nYear) {
        int nMonth = 1; // February
        // February 12th

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 12);
        return cal;
    }

    public static java.util.Calendar ChristmasDay(int nYear) {
        int nMonth = 11; // Decmeber
        // December 25th
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 25);
        return cal;
    }

    public static java.util.Calendar ChristmasDayObserved(int nYear) {
        int nX;
        int nMonth = 11; // December
        java.util.Calendar cal;

        cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 25);
        nX = cal.get(Calendar.DAY_OF_WEEK);
        switch (nX) {
        case 0: {// Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 26);
            return cal;
        }
        case 1: // Monday
        case 2: // Tuesday
        case 3: // Wednesday
        case 4: // Thrusday
        case 5: { // Friday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 25);
            return cal;
        }
        default: {
            // Saturday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 24);
            return cal;
        }
        }
    }

    public static java.util.Calendar ColumbusDayObserved(int nYear) {
        // Second Monday in October
        int nX;
        int nMonth = 9; // October 
        java.util.Calendar cal;

        cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 1);
        nX = cal.get(Calendar.DAY_OF_WEEK);
        switch (nX) {
        case 0: {// Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 9);
            return cal;
        }
        case 1: {// Monday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 15);
            return cal;
        }
        case 2: // Tuesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 14);
            return cal;
        }
        case 3: // Wednesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 13);
            return cal;
        }
        case 4: // Thrusday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 12);
            return cal;
        }
        case 5: // Friday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 11);
            return cal;
        }
        default: // Saturday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 10);
            return cal;
        }
        }

    }

    public static java.util.Calendar EasterMonday(int nYear) {
        int nEasterMonth = 0;
        int nEasterDay = 0;
        int nMonthMarch = 2; // March
        int nMonthApril = 3; // April
        java.util.Calendar cEasterSunday = EasterSunday(nYear);
        nEasterMonth = cEasterSunday.get(Calendar.MONTH);
        nEasterDay = cEasterSunday.get(Calendar.DAY_OF_MONTH);
        if (nEasterMonth == nMonthMarch || nEasterDay == 31) {
            java.util.Calendar cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonthApril, 1);
            return cal;
        } else {
            java.util.Calendar cal = java.util.Calendar.getInstance();
            cal.set(nYear, nEasterMonth, ++nEasterDay);
            return cal;
        }
    }

    public static java.util.Calendar EasterSunday(int nYear) {
        /*  Calculate Easter Sunday
            
          Written by Gregory N. Mirsky
            
          Source: 2nd Edition by Peter Duffett-Smith. It was originally from
          Butcher's Ecclesiastical Calendar, published in 1876. This
          algorithm has also been published in the 1922 book General
          Astronomy by Spencer Jones; in The Journal of the British
          Astronomical Association (Vol.88, page 91, December 1977); and in
          Astronomical Algorithms (1991) by Jean Meeus.
            
          This algorithm holds for any year in the Gregorian Calendar, which
          (of course) means years including and after 1583.
            
                a=year%19
                b=year/100
                c=year%100
                d=b/4
                e=b%4
                f=(b+8)/25
                g=(b-f+1)/3
                h=(19*a+b-d-g+15)%30
                i=c/4
                k=c%4
                l=(32+2*e+2*i-h-k)%7
                m=(a+11*h+22*l)/451
                Easter Month =(h+l-7*m+114)/31  [3=March, 4=April]
                p=(h+l-7*m+114)%31
                Easter Date=p+1     (date in Easter Month)
            
          Note: Integer truncation is already factored into the
          calculations. Using higher percision variables will cause
          inaccurate calculations. 
        */

        int nA = 0;
        int nB = 0;
        int nC = 0;
        int nD = 0;
        int nE = 0;
        int nF = 0;
        int nG = 0;
        int nH = 0;
        int nI = 0;
        int nK = 0;
        int nL = 0;
        int nM = 0;
        int nP = 0;
        int nEasterMonth = 0;
        int nEasterDay = 0;

        // Calculate Easter
        if (nYear < 1900) {
            // if year is in java format put it into standard
            // format for the calculation
            nYear += 1900;
        }
        nA = nYear % 19;
        nB = nYear / 100;
        nC = nYear % 100;
        nD = nB / 4;
        nE = nB % 4;
        nF = (nB + 8) / 25;
        nG = (nB - nF + 1) / 3;
        nH = (19 * nA + nB - nD - nG + 15) % 30;
        nI = nC / 4;
        nK = nC % 4;
        nL = (32 + 2 * nE + 2 * nI - nH - nK) % 7;
        nM = (nA + 11 * nH + 22 * nL) / 451;

        //  [3=March, 4=April]
        nEasterMonth = (nH + nL - 7 * nM + 114) / 31;
        --nEasterMonth;
        nP = (nH + nL - 7 * nM + 114) % 31;

        // Date in Easter Month.
        nEasterDay = nP + 1;

        // Uncorrect for our earlier correction.
        nYear -= 1900;

        // Populate the date object...
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nEasterMonth, nEasterDay);
        return cal;
    }

    public static java.util.Calendar GoodFridayObserved(int nYear) {
        // Get Easter Sunday and subtract two days
        int nEasterMonth = 0;
        int nEasterDay = 0;
        int nGoodFridayMonth = 0;
        int nGoodFridayDay = 0;
        java.util.Calendar cEasterSunday;

        cEasterSunday = EasterSunday(nYear);
        nEasterMonth = cEasterSunday.get(Calendar.MONTH);
        nEasterDay = cEasterSunday.get(Calendar.DAY_OF_MONTH);
        if (nEasterDay <= 3 && nEasterMonth == 3) { // Check if <= April 3rd

            switch (nEasterDay) {
            case 3:
                nGoodFridayMonth = nEasterMonth - 1;
                nGoodFridayDay = nEasterDay - 2;
                break;
            case 2:
                nGoodFridayMonth = nEasterMonth - 1;
                nGoodFridayDay = 31;
                break;
            case 1:
                nGoodFridayMonth = nEasterMonth - 1;
                nGoodFridayDay = 31;
                break;
            default:
                nGoodFridayMonth = nEasterMonth;
                nGoodFridayDay = nEasterDay - 2;
            }
        } else {
            nGoodFridayMonth = nEasterMonth;
            nGoodFridayDay = nEasterDay - 2;
        }

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nGoodFridayMonth, nGoodFridayDay);
        return cal;
    }

    public static java.util.Calendar Halloween(int nYear) {
        int nMonth = 9;
        // October 31st

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 31);
        return cal;
    }

    public static java.util.Calendar IndependenceDay(int nYear) {
        int nMonth = 6; // July
        // July 4th

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 4);
        return cal;
    }

    public static java.util.Calendar IndependenceDayObserved(int nYear) {
        int nX;
        int nMonth = 6; // July

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 4);

        nX = cal.get(Calendar.DAY_OF_WEEK);
        switch (nX) {
        case 0: // Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 5);
            return cal;
        case 1: // Monday
        case 2: // Tuesday
        case 3: // Wednesday
        case 4: // Thrusday
        case 5: // Friday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 4);
            return cal;
        default:
            // Saturday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 3);
            return cal;
        }
    }

    public static java.util.Calendar LaborDayObserved(int nYear) {
        // The first Monday in September
        int nX;
        int nMonth = 8; // September
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, 9, 1);

        nX = cal.get(Calendar.DAY_OF_WEEK);

        switch (nX) {
        case 0: // Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 2);
            return cal;
        case 1: // Monday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 7);
            return cal;
        case 2: // Tuesday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 6);
            return cal;
        case 3: // Wednesday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 5);
            return cal;
        case 4: // Thrusday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 4);
            return cal;
        case 5: // Friday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 3);
            return cal;
        default: // Saturday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 2);
            return cal;
        }
    }

    public java.util.Calendar MartinLutherKingObserved(int nYear) {
        // Third Monday in January
        int nX;
        int nMonth = 0; // January
        java.util.Calendar cal;

        cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 1);
        nX = cal.get(Calendar.DAY_OF_WEEK);

        switch (nX) {
        case 0: {// Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 16);
            return cal;
        }
        case 1: {// Monday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 15);
            return cal;
        }
        case 2: // Tuesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 21);
            return cal;
        }
        case 3: // Wednesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 20);
            return cal;
        }
        case 4: // Thrusday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 19);
            return cal;
        }
        case 5: // Friday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 18);
            return cal;
        }
        default: // Saturday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 17);
            return cal;
        }

        }
    }

    public static java.util.Calendar MemorialDayObserved(int nYear) {
        // Last Monday in May
        int nX;
        int nMonth = 4; //May
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 31);

        nX = cal.get(Calendar.DAY_OF_WEEK);

        switch (nX) {
        case 0: // Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 25);
            return cal;
        case 1: // Monday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 31);
            return cal;
        case 2: // Tuesday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 30);
            return cal;
        case 3: // Wednesday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 29);
            return cal;
        case 4: // Thrusday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 28);
            return cal;
        case 5: // Friday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 27);
            return cal;
        default: // Saturday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 26);
            return cal;

        }
    }

    public static java.util.Calendar NewYearsDay(int nYear) {
        // January 1st
        int nMonth = 0; // January

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 1);

        return cal;
    }

    public static java.util.Calendar NewYearsDayObserved(int nYear) {
        int nX;
        int nMonth = 0; // January
        int nMonthDecember = 11; // December

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 1);

        nX = cal.get(Calendar.DAY_OF_WEEK);

        if (nYear > 1900)
            nYear -= 1900;

        switch (nX) {
        case 0: // Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 2);
            return cal;
        case 1: // Monday
        case 2: // Tuesday
        case 3: // Wednesday
        case 4: // Thrusday
        case 5: // Friday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 1);
            return cal;
        default:
            // Saturday, then observe on friday of previous year
            cal = java.util.Calendar.getInstance();
            cal.set(--nYear, nMonthDecember, 31);
            return cal;
        }
    }

    public static java.util.Calendar PresidentsDayObserved(int nYear) {
        // Third Monday in February
        int nX;
        int nMonth = 1; // February

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 1);

        nX = cal.get(Calendar.DAY_OF_WEEK);

        switch (nX) {
        case 0: {// Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 16);
            return cal;
        }
        case 1: {// Monday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 15);
            return cal;
        }
        case 2: // Tuesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 21);
            return cal;
        }
        case 3: // Wednesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 20);
            return cal;
        }
        case 4: // Thrusday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 19);
            return cal;
        }
        case 5: // Friday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 18);
            return cal;
        }
        default: // Saturday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 17);
            return cal;
        }
        }
    }

    public static java.util.Calendar ThanksgivingObserved(int nYear) {
        int nX;
        int nMonth = 10; // November
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 1);

        nX = cal.get(Calendar.DAY_OF_WEEK);
        switch (nX) {

        case 0: {// Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 26);
            return cal;
        }
        case 1: {// Monday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 25);
            return cal;
        }
        case 2: // Tuesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 24);
            return cal;
        }
        case 3: // Wednesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 23);
            return cal;
        }
        case 4: // Thrusday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 22);
            return cal;
        }
        case 5: // Friday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 28);
            return cal;
        }
        default: // Saturday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 27);
            return cal;
        }
        }
    }

    public static java.util.Calendar USElectionDay(int nYear) {
        // First Tuesday in November
        int nX;
        int nMonth = 10; // November
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 1);
        nX = cal.get(Calendar.DAY_OF_WEEK);
        switch (nX) {
        case 0: {// Sunday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 3);
            return cal;
        }
        case 1: {// Monday
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 2);
            return cal;
        }
        case 2: // Tuesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 1);
            return cal;
        }
        case 3: // Wednesday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 7);
            return cal;
        }
        case 4: // Thrusday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 6);
            return cal;
        }
        case 5: // Friday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 5);
            return cal;
        }
        default: // Saturday
        {
            cal = java.util.Calendar.getInstance();
            cal.set(nYear, nMonth, 4);
            return cal;
        }
        }
    }

    public static java.util.Calendar ValentinesDay(int nYear) {
        int nMonth = 1; // February
        // February 14th

        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 14);
        return cal;
    }

    public static java.util.Calendar VeteransDayObserved(int nYear) {
        //November 11th
        int nMonth = 10; // November
        java.util.Calendar cal = java.util.Calendar.getInstance();
        cal.set(nYear, nMonth, 11);
        return cal;
    }

    public static String getClassInfo() {
        return ("Name: Holidays\r\n" + "Author: Gregory N. Mirsky\r\n" + "Updated: John D. Mitchell\r\n"
                + "Version 1.02\r\n" + "Copyright 1997, All rights reserved.");
    }
}