获取本地日历 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 SE 的 Calendar
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 。
我知道如何为标准公历执行此操作,但我想为我的社区使用本地日历。计划是为 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 SE 的 Calendar
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