Data Type Java

//** 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.");
  }
}