获取本地日历 java 中一个月的第一天

Get the first day of a month in java FOR a local calendar

我知道如何为标准公历执行此操作,但我想为我的社区使用本地日历。计划是为 android.

制作一个日历应用程序

我有这段公历代码,但无法理解它背后的算法。

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;
}

另外,请告诉我这是否是日历应用程序的正确步骤。如果您能提出任何技术建议,我将不胜感激。

如果您需要有关我的日历的更多详细信息,请留言,我会提供完整的详细信息。

我猜参数 M、D 和 Y 代表月、日、年。我还猜你是在谈论获取每月第一天的工作日,对吧?

我会使用来自 Java SECalendar class 日历的内置功能。

这可能看起来像:

...
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));
...

您可以先设置其他字段,当然这取决于您的需要。

编辑(关于日历的自定义类型):

如果您的日历中没有闰年,您可以声明具有月份长度的常量数组。然后你可以使用模运算符手动添加你的工作日,就像这样:

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;
}

补充提示:

只有当您的日历系统中没有闰年时才有效!

编辑:

用实数替换了年份长度的样本编号和月份长度的省略号

编辑:

添加了第一年第一天的常量 (1/1/0)。

这是一个很好的方法,基于Zeller's congruence which you can see for further explanation. However I would go with Java's standard Calendar methods as @olik79 has posted