[英]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
類為日歷使用內置功能。
這可能看起來像:
...
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));
...
您可以先設置其他字段,具體取決於您的需求。
編輯(關於日歷的自定義類型):
如果日歷中沒有任何閏年,則可以聲明具有月份長度的常量數組。 然后你可以使用modulo運算符手動添加你的工作日,就像這樣:
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的一致性 ,您可以看到進一步的解釋。 但是,我會使用Java的標准Calendar
方法,因為@ olik79已在此處發布。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.