Skip to main content

ISC Program: Predict day of the week from date

Algorithm:
1)Take the last two digits of the year.
2)Divide by 4, discarding any fraction.
3)Add the day of the month.
4)Add the month's key value: JFM AMJ JAS OND 144 025 036 146
5)Subtract 1 for January or February of a leap year.
6)For a Gregorian date, add 0 for 1900's, 6 for 2000's, 4 for 1700's, 2 for 1800's; for other years, add or subtract multiples of 400.
7)For a Julian date, add 1 for 1700's, and 1 for every additional century you go back.
8)Add the last two digits of the year.
9)Divide by 7 and take the remainder.

Example:

Let's take a date: 26/03/2027
Last two digit of the year = 27
Divide by 4 discard fraction = 27/4 = 6.75 = 6
Add day = 6 + 26 = 32
Month key = 4 + 32 = 36
Add year code = 36 + 6 = 42
Now add two digits of the first year = 42 + 27 = 69
Now get the remainder after dividing by 7 = 69%7=6
So 1 is Sunday
so 6 is Friday
So 27/03/2027

Program:
import java.util.Scanner;
public class daydate {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter the year: ");
        int year = sc.nextInt();
        System.out.print("Enter the month (1-12): ");
        int month = sc.nextInt();
        System.out.print("Enter the day of the month: ");
        int day = sc.nextInt();
        int lastTwoDigitsOfYear = year % 100;
        int step1 = lastTwoDigitsOfYear / 4;
        int step2 = step1 + day;
        int monthKeyValue = 0;
        switch (month) {
            case 1: // January
                monthKeyValue = 1;
                break;
            case 2: // February
                monthKeyValue = 4;
                break;
            case 3: // March
                monthKeyValue = 4;
                break;
            case 4: // April
                monthKeyValue = 0;
                break;
            case 5: // May
                monthKeyValue = 2;
                break;
            case 6: // June
                monthKeyValue = 5;
                break;
            case 7: // July
                monthKeyValue = 0;
                break;
            case 8: // August
                monthKeyValue = 3;
                break;
            case 9: // September
                monthKeyValue = 6;
                break;
            case 10: // October
                monthKeyValue = 1;
                break;
            case 11: // November
                monthKeyValue = 4;
                break;
            case 12: // December
                monthKeyValue = 6;
                break;
        }

        int step3 = step2 + monthKeyValue;

        // Leap year adjustment
        if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { // Check for leap year
            if (month == 1 || month == 2) {
                step3--;
            }
        }

        // Gregorian Calendar Year Adjustment
        int yearAdjustment = 0;
        if (year >= 1700 && year < 1800) {
            yearAdjustment = 4;
        } else if (year >= 1800 && year < 1900) {
            yearAdjustment = 2;
        } else if (year >= 1900 && year < 2000) {
            yearAdjustment = 0;
        } else if (year >= 2000 && year < 2100) {
            yearAdjustment = 6;
        } else {
            int century = year / 100;
            yearAdjustment = (6 - 2 * (century % 4)) % 7;
            if (yearAdjustment < 0) yearAdjustment += 7; // Ensure positive value
        }
        step3 += yearAdjustment;
        int step4 = step3 + lastTwoDigitsOfYear;
        int dayOfWeek = step4 % 7;
        String[] dayNames = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"}; //0 is Saturday as per the algorithm

        System.out.println("The day of the week is: " + dayNames[dayOfWeek]);
        sc.close();
    }
}

Popular posts from this blog