Here you can find the source of getOfflimitDates(int year)
private static List<Date> getOfflimitDates(int year)
//package com.java2s; import java.util.*; public class Main { private static List<Date> getOfflimitDates(int year) { List<Date> offlimitDates = new ArrayList<>(); Calendar baseCalendar = GregorianCalendar.getInstance(); baseCalendar.clear();/* w ww .ja v a 2 s . c o m*/ // Add in the static dates for the year. // New years day baseCalendar.set(year, Calendar.JANUARY, 1); offlimitDates.add(offsetForWeekend(baseCalendar)); // Independence Day baseCalendar.set(year, Calendar.JULY, 4); offlimitDates.add(offsetForWeekend(baseCalendar)); // Veterans Day --not NYSE Holiday // baseCalendar.set(year, Calendar.NOVEMBER, 11); // offlimitDates.add(offsetForWeekend(baseCalendar)); // Christmas baseCalendar.set(year, Calendar.DECEMBER, 25); offlimitDates.add(offsetForWeekend(baseCalendar)); // Now deal with floating holidays. // Martin Luther King Day offlimitDates.add(calculateFloatingHoliday(3, Calendar.MONDAY, year, Calendar.JANUARY)); // Presidents Day offlimitDates.add(calculateFloatingHoliday(3, Calendar.MONDAY, year, Calendar.FEBRUARY)); // Memorial Day offlimitDates.add(calculateFloatingHoliday(0, Calendar.MONDAY, year, Calendar.MAY)); // Labor Day offlimitDates.add(calculateFloatingHoliday(1, Calendar.MONDAY, year, Calendar.SEPTEMBER)); // Columbus Day -- not NYSE Holiday // offlimitDates.add(calculateFloatingHoliday(2, Calendar.MONDAY, year, // Calendar.OCTOBER)); // Thanksgiving Day and Thanksgiving Friday -- Friday not NYSE Holiday Date thanksgiving = calculateFloatingHoliday(4, Calendar.THURSDAY, year, Calendar.NOVEMBER); offlimitDates.add(thanksgiving); // Friday after Thanksgiving is not NYSE Holiday // Good Friday Date goodFriday = GoodFridayObserved(year); offlimitDates.add(goodFriday); return offlimitDates; } private static Date offsetForWeekend(Calendar baseCal) { Date returnDate = baseCal.getTime(); if (baseCal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { // if (log.isDebugEnabled()) { // log.debug("Offsetting the Saturday by -1: " + returnDate); // } return addDays(returnDate, -1); } else if (baseCal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { // if (log.isDebugEnabled()) { // log.debug("Offsetting the Sunday by +1: " + returnDate); // } return addDays(returnDate, 1); } else { return returnDate; } } /** * This method will take in the various parameters and return a Date object * that represents that value. * * Ex. To get Martin Luther Kings BDay, which is the 3rd Monday of January, * the method call would be: * * calculateFloatingHoliday(3, Calendar.MONDAY, year, Calendar.JANUARY); * * Reference material can be found at: * http://michaelthompson.org/technikos/holidays.php#MemorialDay * * @param nth 0 for Last, 1 for 1st, 2 for 2nd, etc. * @param dayOfWeek Use Calendar.MONDAY, Calendar.TUESDAY, etc. * @param year year * @param month Use Calendar.JANUARY, etc. * @return date which corresponds to inputs */ private static Date calculateFloatingHoliday(int nth, int dayOfWeek, int year, int month) { Calendar baseCal = Calendar.getInstance(); baseCal.clear(); // Determine what the very earliest day this could occur. // If the value was 0 for the nth parameter, increment to the following // month so that it can be subtracted after. baseCal.set(year, month, 1); if (nth <= 0) baseCal.add(Calendar.MONTH, 1); Date baseDate = baseCal.getTime(); // Figure out which day of the week that this "earliest" could occur on // and then determine what the offset is for our day that we actually // need. int baseDayOfWeek = baseCal.get(Calendar.DAY_OF_WEEK); int fwd = dayOfWeek - baseDayOfWeek; // Based on the offset and the nth parameter, we are able to determine // the offset of days and then // adjust our base date. return addDays(baseDate, (fwd + (nth - (fwd >= 0 ? 1 : 0)) * 7)); } private static Date GoodFridayObserved(int nYear) { // Get Easter Sunday and subtract two days int nEasterMonth; int nEasterDay; int nGoodFridayMonth; int nGoodFridayDay; Date dEasterSunday; dEasterSunday = EasterSunday(nYear); GregorianCalendar gc = new GregorianCalendar(); gc.setTime(dEasterSunday); // nEasterMonth = dEasterSunday.getMonth(); nEasterMonth = gc.get(Calendar.MONTH); // nEasterDay = dEasterSunday.getDate(); nEasterDay = gc.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; } // return new Date(nYear, nGoodFridayMonth, nGoodFridayDay); // old date // format return new GregorianCalendar(nYear, nGoodFridayMonth, nGoodFridayDay).getTime(); } /** * Add given number of days to a date. * * @param dateToAdd The date * @param numberOfDay The number of days to add * @return new date */ private static Date addDays(Date dateToAdd, int numberOfDay) { if (dateToAdd == null) { throw new IllegalArgumentException("Date can't be null!"); } Calendar tempCal = Calendar.getInstance(); tempCal.setTime(dateToAdd); tempCal.add(Calendar.DATE, numberOfDay); return tempCal.getTime(); } private static Date 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 precision variables will cause inaccurate calculations. */ int nA; int nB; int nC; int nD; int nE; int nF; int nG; int nH; int nI; int nK; int nL; int nM; int nP; int nEasterMonth; int nEasterDay; 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; // Un-correct our earlier correction. nYear -= 1900; // Populate the date object... // return new Date(nYear, nEasterMonth, nEasterDay); //old format for // date return new GregorianCalendar(nYear, nEasterMonth, nEasterDay).getTime(); } }