package net.javaiq.examples.date;
@author
public class NthWeekDayOfTheMonthFinder {
@param
@param
@param
@param
@return
public static double findNthWeekDayOfTheMonth(int nth, int weekDay, int month, int year) {
int[] daysOfMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int[] daysOfMonthLeapYear = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
if (nth > 0)
return (nth - 1) * 7 + 1 + (7 + weekDay - findDayOfTheWeek((nth - 1) * 7 + 1, month, year)) % 7;
int days = 0;
if (leapYear(year)) {
days = daysOfMonthLeapYear[month - 1];
} else {
days = daysOfMonth[month - 1];
}
return (days - (findDayOfTheWeek(days, month, year) - weekDay + 7) % 7);
}
public static boolean leapYear(int year) {
if ((year / 4) != Math.floor(year / 4))
return false;
if ((year / 100) != Math.floor(year / 100))
return true;
if ((year / 400) != Math.floor(year / 400))
return false;
return true;
}
public static double findDayOfTheWeek(int day, int month, int year) {
double a = Math.floor((14 - month) / 12);
double y = year - a;
double m = month + 12 * a - 2;
double d =
(day + y + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400) + Math.floor((31 * m) / 12)) %
7;
return d + 1;
}
@param
public static void main(String[] args) {
int nth = 2;
int weekDay = 7;
int month = 7;
int year = 2020;
double nthDay = findNthWeekDayOfTheMonth(nth, weekDay, month, year);
System.out.println(" The day of the month : " + nthDay);
}
}