import java.text.DateFormatSymbols; import java.util.*; public class EasterRelatedHolidays { final static Map holidayOffsets; static { holidayOffsets = new LinkedHashMap<>(); holidayOffsets.put("Easter", 0); holidayOffsets.put("Ascension", 39); holidayOffsets.put("Pentecost", 10); holidayOffsets.put("Trinity", 7); holidayOffsets.put("Corpus", 4); } public static void main(String[] args) { System.out.println("Christian holidays, related to Easter," + " for each centennial from 400 to 2100 CE:"); for (int y = 400; y <= 2100; y += 100) printEasterRelatedHolidays(y); System.out.println("\nChristian holidays, related to Easter," + " for years from 2010 to 2020 CE:"); for (int y = 2010; y < 2021; y++) printEasterRelatedHolidays(y); } static void printEasterRelatedHolidays(int year) { final int a = year % 19; final int b = year / 100; final int c = year % 100; final int d = b / 4; final int e = b % 4; final int f = (b + 8) / 25; final int g = (b - f + 1) / 3; final int h = (19 * a + b - d - g + 15) % 30; final int i = c / 4; final int k = c % 4; final int l = (32 + 2 * e + 2 * i - h - k) % 7; final int m = (a + 11 * h + 22 * l) / 451; final int n = h + l - 7 * m + 114; final int month = n / 31 - 1; final int day = (n % 31) + 1; Calendar date = new GregorianCalendar(year, month, day); String[] months = new DateFormatSymbols(Locale.US).getShortMonths(); System.out.printf("%4d ", year); for (String hd : holidayOffsets.keySet()) { date.add(Calendar.DATE, holidayOffsets.get(hd)); System.out.printf("%s: %2d %s ", hd, date.get(Calendar.DAY_OF_MONTH), months[date.get(Calendar.MONTH)]); } System.out.println(); } }