在 Java 中取得目前月份的第一個日期
1. 概述
在這篇短文中,我們將重點放在如何使用 Java 取得目前月份的第一個日期。
首先,我們將闡明如何使用 JDK 解決方案來做到這一點。然後,我們將展示如何使用 Joda Time 等第三方函式庫實現相同的結果。
2.問題介紹
一如既往,讓我們透過一個例子來理解主要問題。假設目前日期是 2023 年 10 月 15 日:
LocalDate currentDate = LocalDate.of(2023, 10, 15);
在這裡,我們的目標是獲取 10 月的第一個日期,即 2023-10-01。那麼,讓我們深入研究程式碼。
3. 使用Calendar
類
The
類別提供了一組方便的方法,我們可以使用它們Calendar
操作日期和時間。它提供了一種獲取給定月份的第一個日期的便捷方法。
那麼,讓我們看看它的實際效果:
@Test
void givenMonth_whenUsingCalendar_thenReturnFirstDay() {
Date currentDate = new GregorianCalendar(2023, Calendar.NOVEMBER, 23).getTime();
Date expectedDate = new GregorianCalendar(2023, Calendar.NOVEMBER, 1).getTime();
Calendar cal = Calendar.getInstance();
cal.setTime(currentDate);
cal.set(Calendar.DAY_OF_MONTH, 1);
assertEquals(expectedDate, cal.getTime());
}
正如我們所看到的,我們將日曆時間更改為給定的 日期。然後,我們呼叫set(Calendar.DAY_OF_MONTH, 1)
將目前月份的日期設為 1 .
此外,我們使用getTime()
方法傳回新日期,它表示該月的第一個日期。
4. 使用 Java 8 日期時間 API
Java 8 隨附了許多即用型功能,例如日期時間 API。引入這個新 API 是為了解決基於Calendar
類別的舊 API 的缺點。
請注意,這個新的 Java 8 API 是處理日期的最佳方式。
那麼,讓我們深入探討這個新 API 提供了哪些方法來回答我們的核心問題。
4.1.使用LocalDate
類
如果我們想獲取當月的第一天, LocalDate
是一個不錯的選擇。此類別提供了withDayOfMonth()
方法,我們可以使用該方法傳回日期已更改的新日期。
那麼,讓我們在實踐中來看看:
@Test
void givenMonth_whenUsingLocalDate_thenReturnFirstDay() {
LocalDate currentDate = LocalDate.of(2023, 9, 6);
LocalDate expectedDate = LocalDate.of(2023, 9, 1);
assertEquals(expectedDate, currentDate.withDayOfMonth(1));
}
如上所示,我們使用withDayOfMonth(1)
將指定日期的第幾天設為值 1。這樣,我們就得到了該月的第一個日期。
4.2.使用TemporalAdjusters
類
同樣,我們可以使用TemporalAdjusters
來應對我們的挑戰。顧名思義,此類代表了幾個旨在修改時間物件(例如天和月)的調整器。
在這些調整器中,我們找到了firstDayOfMonth
。接下來,讓我們新增一個新的測試案例來測試我們的調整器:
@Test
void givenMonth_whenUsingTemporalAdjusters_thenReturnFirstDay() {
LocalDate currentDate = LocalDate.of(2023, 7, 19);
LocalDate expectedDate = LocalDate.of(2023, 7, 1);
assertEquals(expectedDate, currentDate.with(TemporalAdjusters.firstDayOfMonth()));
}
通常, firstDayOfMonth
會回到特定月份的第一天。請注意,我們使用with()
方法來取得日期的新調整副本。
4.3.使用YearMonth
類
YearMonth
引入了atDay()
方法,將特定的年/月與作為參數傳遞的日期組合起來。
現在,讓我們看看如何使用此方法來實現我們的目標:
@Test
void givenMonth_whenUsingYearMonth_thenReturnFirstDay() {
YearMonth currentDate = YearMonth.of(2023, 4);
LocalDate expectedDate = LocalDate.of(2023, 4, 1);
assertEquals(expectedDate, currentDate.atDay(1));
}
這裡,我們指定 1 作為參數來表示給定年份和月份的第一天。
5. 使用 Joda 時間庫
另一個解決方案是使用 Joda Time 庫。它為 Java 8 之前的日期時間操作提供了標準 API。
在開始使用這個函式庫之前,我們首先需要將其依賴項新增到pom.xml
檔中:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>
Joda Time 帶有LocalDate
類別的變體來表示日期。那麼,讓我們用一個新的測試案例來舉例說明此類的使用:
@Test
void givenMonth_whenUsingJodaTime_thenReturnFirstDay() {
org.joda.time.LocalDate currentDate = org.joda.time.LocalDate.parse("2023-5-10");
org.joda.time.LocalDate expectedDate = org.joda.time.LocalDate.parse("2023-5-1");
assertEquals(expectedDate, currentDate.dayOfMonth()
.withMinimumValue());
}
顧名思義, dayOfMonth()
允許檢索給定月份的日期。此外,我們使用withMinimumValue()
方法將傳回日期的日期設定為最小值 1。
六,結論
在這個簡短的教程中,我們探索了在 Java 中獲取當月第一天的不同方法。
首先,我們討論瞭如何使用 JDK 類別來做到這一點。然後,我們示範如何使用 Joda Time API 來實現相同的目標。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。