給定年份的特定月份有多少天?
一、概述
在本教程中,我們將學習如何在使用 Java 編程時查找給定年份的特定月份的天數。例如,對於表示 2024 年三月的輸入,我們的代碼將返回31
。
2.使用YearMonth
Java 8 引入了全新的日期/時間 API。特別是,它添加了YearMonth
,一個表示年和月組合的不可變對象。
可以通過靜態工廠方法of()
輕鬆創建YearMonth
的實例。然後,我們可以調用其lengthOfMonth()
方法,該方法返回月份的長度,同時考慮年份:
int getDaysInMonthWithYearOfMonth(int month, int year) {
YearMonth yearMonth = YearMonth.of(year, month);
return yearMonth.lengthOfMonth();
}
現在讓我們使用以下輸入檢查我們的方法結果:
- 2024 年 3 月有 31 天
- 1999 年 11 月有 30 天
- 2025 年 2 月有 28 天
- 2004 年 2 月有 29 天
鑑於我們調用了我們的類DaysInMonthUtils
,我們可以編寫我們的單元測試:
@Test
void whenGetDaysInMonthWithYearOfMonth_thenCorrectResult() {
assertEquals(31, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(3, 2024));
assertEquals(30, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(11, 1999));
assertEquals(28, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(2, 2025));
assertEquals(29, new DaysInMonthUtils().getDaysInMonthWithYearOfMonth(2, 2004));
}
3.使用Calendar
對於早於 Java 8 的版本,我們可以回退到原始的 Calendar API。
我們可以使用Calendar
的instance()
方法來獲取使用默認時區和語言環境的Calendar
對象。然後,我們需要將Calendar
的日期和月份更改為給定的日期和月份。最後,我們以Calendar.DATE
作為參數調用getActualMaximum()
以返回我們的結果:
int getDaysInMonthWithCalendar(int month, int year) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month - 1);
return calendar.getActualMaximum(Calendar.DATE);
}
我們為實際的月份數字減去一個,因為Calendar
對月份使用從零開始的索引。另一個需要注意的有趣的事情是我們將月中的第幾天設置為1
。乍一看,這似乎是無意的。但是,我們需要它,因為Calendar
會根據當前日期值調整日期。例如,假設我們的Calendar
設置為 7 月 31 日,我們將月份更改為 6 月。由於 6 月只有 30 天,API 將滾動到下一個有效日期,即 7 月 1 日。
我們現在可以使用相同的測試輸入來驗證我們方法的行為:
@Test
void whenGetDaysInMonthWithCalendar_thenCorrectResult() {
assertEquals(31, new DaysInMonthUtils().getDaysInMonthWithCalendar(3, 2024));
assertEquals(30, new DaysInMonthUtils().getDaysInMonthWithCalendar(11, 1999));
assertEquals(28, new DaysInMonthUtils().getDaysInMonthWithCalendar(2, 2025));
assertEquals(29, new DaysInMonthUtils().getDaysInMonthWithCalendar(2, 2004));
}
4。結論
在本文中,我們使用YearMonth
直接計算一個月中的天數。我們還了解瞭如何規避日曆 API 的設計決策,以確保使用它也能獲得正確的結果。
與往常一樣,代碼 在 GitHub 上可用。