如何用 Java 獲取一個月的最後一天
1. 概述
在這個簡短的教程中,我們將重點介紹如何使用 Java 獲取給定月份的最後一天。
首先,我們將重點介紹如何使用核心 Java 方法來完成此操作。然後,我們將說明如何使用 Joda Time 庫實現相同的目標。
2. Java 8之前
在 Java 8 之前, Date
和Calendar
類是在 Java 中操作時間和日期的不錯選擇。
通常, Calendar
提供了一組方法和常量,我們可以使用它們來訪問和操作時間信息,例如天、月和年。
那麼,讓我們看看如何使用它來獲取特定月份的最後一天:
static int getLastDayOfMonthUsingCalendar(int month) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, month);
return cal.getActualMaximum(Calendar.DAY_OF_MONTH);
}
正如我們所看到的,我們使用 Calendar.getInstance() 創建了一個Calendar
對象Calendar.getInstance().
然後,我們將日曆月份設置為指定的月份。此外,我們使用getActualMaximum()
方法和Calendar.DAY_OF_MONTH
字段來檢索該月的最後一天。
現在,讓我們添加一個測試用例來確認我們的方法:
@Test
void givenMonth_whenUsingCalendar_thenReturnLastDay() {
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingCalendar(0));
assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingCalendar(3));
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingCalendar(9));
}
這裡要提到的重要一點是月份值是從零開始的。例如,一月的值為零,因此我們需要從所需的月份值中減去 1。
3.Java 8 日期時間 API
Java 8 帶來了許多新功能和增強功能。在這些功能中,我們找到了日期時間 API。引入此 API 是為了克服基於Date
和Calendar
類的舊 API 的限制。
那麼,讓我們深入研究一下這個新 API 提供了哪些選項來獲取一個月的最後一天。
3.1.使用YearMonth
操作月份的最常見方法之一是使用YearMonth
類。顧名思義,它表示年和月的組合。
此類提供atEndOfMonth()
方法,該方法返回一個LocalDate
對象,該對象表示給定月份結束時的日期。
那麼,讓我們在實踐中看看:
static int getLastDayOfMonthUsingYearMonth(YearMonth date) {
return date.atEndOfMonth()
.getDayOfMonth();
}
簡而言之,我們使用atEndOfMonth()
來獲取該月的最後一個日期。然後,我們與getDayOfMonth()
鏈接以檢索返回的LocalDate
對象的日期。
與往常一樣,讓我們添加一個測試用例:
@Test
void givenMonth_whenUsingYearMonth_thenReturnLastDay() {
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingYearMonth(YearMonth.of(2023, 1)));
assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingYearMonth(YearMonth.of(2023, 4)));
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingYearMonth(YearMonth.of(2023, 10)));
}
3.2.使用TemporalAdjusters
另一個解決方案是使用TemporalAdjusters
類。通常,此類提供了幾個現成的靜態方法,我們可以使用它們來調整時間對象。
那麼,讓我們一起看看如何使用它來獲取LocalDate
實例的最後一天:
static int getLastDayOfMonthUsingTemporalAdjusters(LocalDate date) {
return date.with(TemporalAdjusters.lastDayOfMonth())
.getDayOfMonth();
}
如上所示,該類提供了調整器lastDayOfMonth().
它返回設置為該月最後一天的新日期。
此外,我們使用getDayOfMonth()
方法來獲取返回日期的日期。
接下來,我們將使用測試用例確認我們的方法:
@Test
void givenMonth_whenUsingTemporalAdjusters_thenReturnLastDay() {
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingTemporalAdjusters(LocalDate.of(2023, 1, 1)));
assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingTemporalAdjusters(LocalDate.of(2023, 4, 1)));
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingTemporalAdjusters(LocalDate.of(2023, 10, 1)));
}
4.喬達時間庫
或者,我們可以使用 Joda Time API 來完成相同的目的。它是 Java 8 之前日期時間操作的事實上的標準。首先,我們需要將Joda Time 依賴項添加到pom.xml
文件中:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>
同樣,Joda Time 提供LocalDate
類來表示日期。這包括可用於獲取該月最後一天的withMaximumValue()
方法。
讓我們看看實際操作:
static int getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate date) {
return date.dayOfMonth()
.withMaximumValue()
.getDayOfMonth();
}
最後,讓我們創建另一個測試用例:
@Test
void givenMonth_whenUsingJodaTime_thenReturnLastDay() {
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate.parse("2023-1-1")));
assertEquals(30, LastDayOfMonth.getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate.parse("2023-4-1")));
assertEquals(31, LastDayOfMonth.getLastDayOfMonthUsingJodaTime(org.joda.time.LocalDate.parse("2023-10-1")));
}
不出所料,測試成功通過。
5. 結論
在本文中,我們探討了在 Java 中獲取給定月份最後一天的不同方法。一路上,我們解釋瞭如何使用核心 Java 來做到這一點。然後,我們演示瞭如何使用Joda Time等第三方庫。
與往常一樣,本文中使用的代碼可以在 GitHub 上找到。