我知道如何为标准公历执行此操作,但我想为我的社区使用本地日历。计划是为 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
类的内置日历功能.
这可能看起来像:
...
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)。
关于java - 在 java 中获取本地日历的一个月的第一天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32163996/