import java.text.DateFormatSymbols;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Locale;
public class LastFridays {
// Return the last Friday of a specific month
static int lastFridayOfMonth(GregorianCalendar c, int year, int month) {
// Set to first day of this month
c.set(year, month, 1);
// Last day of this month
int totalDays = c.getActualMaximum(Calendar.DAY_OF_MONTH);
c.set(Calendar.DAY_OF_MONTH, totalDays);
// Compute rollback to Friday
int dow = c.get(Calendar.DAY_OF_WEEK); // 1=Sun ... 7=Sat
int daysToRollBack = (dow - Calendar.FRIDAY + 7) % 7;
return totalDays - daysToRollBack;
}
public static void main(String[] args) throws Exception {
// Handle missing argument
int year;
if (args.length == 0) {
year = Calendar.getInstance().get(Calendar.YEAR);
} else {
year = Integer.parseInt(args[0]);
}
GregorianCalendar c = new GregorianCalendar(year, 0, 1);
String[] months = new DateFormatSymbols(Locale.US).getShortMonths();
for (int m = 0; m < 12; m++) {
String mon = months[m];
if (!mon.isEmpty()) {
int day = lastFridayOfMonth(c, year, m);
System.out.printf("%d %s %d\n", year, mon, day);
// Move to next month safely
c.add(Calendar.MONTH, 1);
}
}
}
}
/*
run:
2026 Jan 30
2026 Feb 27
2026 Mar 27
2026 Apr 24
2026 May 29
2026 Jun 26
2026 Jul 31
2026 Aug 28
2026 Sep 25
2026 Oct 30
2026 Nov 27
2026 Dec 25
*/