簡體   English   中英

獲取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類為日歷使用內置功能。

這可能看起來像:

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM