Java – Get the first day of the month of the local calendar in Java

Get the first day of the month of the local calendar in Java… here is a solution to the problem.

Get the first day of the month of the local calendar in Java

I

know how to do this for the standard Gregorian calendar, but I want to use a local calendar for my community. The plan is to make a calendar app for Android.

I have this code for the Gregorian calendar but can’t figure out the algorithm behind it.

public static int day(int M, int D, int Y) {
    int y = Y - (14 - M) / 12;
    int x = y + y/4 - y/100 + y/400;
    int m = M + 12 * ((14 - M) / 12) - 2;
    int d = (D + x + (31*m)/12) % 7;
    return d;
}

Also, please tell me if this is the right step for the calendar app. I would appreciate any technical suggestions you could make.

If you need more details about my calendar, leave a message and I will provide full details.

Solution

I guess the parameters M, D, and Y represent month, day, year. I’m also guessing you’re talking about getting the first working day of each month, right?

I’ll use the built-in calendar feature from the Calendar class of Java SE

This might look like this:

...
Calendar localCalendar = Calendar.getInstance();
localCalendar.set(Calendar.MONTH, Calendar.AUGUST);
localCalendar.set(Calendar.DAY_OF_MONTH, 1);
int dayOfWeek = localCalendar.get(Calendar.get(DAY_OF_WEEK));
...

Of course, you can set other fields first, depending on your needs.

Edit (about custom types for calendars):

If you don’t have leap years in your calendar, you can declare a constant array with the length of the month. You can then manually add your workdays using the modulo operator as follows:

int WEEKDAY_OF_FIRST_DAY_IN_FIRST_YEAR = 3;  0 for monday, 1 for tuesday, etc.
int LENGTH_OF_WEEK = 7;
int DAYS_IN_YEAR = 365;  31 + 32 + 31 + 32 + 31 + 30 + 30 + 30 + 29 + 29 + 30 + 30
int DAYS_OF_MONTHS[] = { 31, 32, 31, 32, 31, 30, 30, 30, 29, 29, 30, 30 };

public static int day(int M, int D, int Y) {
    int firstDayInCurrentYear = WEEKDAY_OF_FIRST_DAY_IN_FIRST_YEAR + 
        (Y * DAYS_IN_YEAR) % LENGTH_OF_WEEK;
    int firstDayOfMonth = firstDayInCurrentYear;

for (int month = 0; month < M; month++) {
        firstDayOfMonth = 
            (firstDayOfMonth + DAYS_OF_MONTH[month]) % LENGTH_OF_WEEK;
    }

return firstDayOfMonth;
}

Additional tips:

This only applies if there are no leap years in the calendar system!

Edit:

Replace the number

of samples for the year length and the ellipsis for the month length with a real number

Edit:

Added a constant for the first day of the first year (1/1/0).

Related Problems and Solutions