在 Java 中向當前日期添加一個月
1. 概述
在這個簡短的教程中,我們將學習如何在 Java 中將當前日期加一個月。
首先,我們將了解如何使用核心 Java 方法來做到這一點。然後,我們將了解如何使用 Joda-Time 和 Apache Commons Lang3 等外部庫來完成相同的任務。
2. Java核心方法
Java 提供了幾種方便的方法來操作日期和時間。讓我們探討一下在當前日期上添加一個月的不同選項。
2.1.使用Calendar
類
對於Java 8之前的版本,我們可以使用Calendar
來處理時態數據。此類提供了一組可用於操作日期和時間的方法。
那麼,讓我們看看它的實際效果:
@Test
void givenCalendarDate_whenAddingOneMonth_thenDateIsChangedCorrectly() {
Calendar calendar = Calendar.getInstance();
// Dummy current date
calendar.set(2023, Calendar.APRIL, 20);
// add one month
calendar.add(Calendar.MONTH, 1);
assertEquals(Calendar.MAY, calendar.get(Calendar.MONTH));
assertEquals(20, calendar.get(Calendar.DAY_OF_MONTH));
assertEquals(2023, calendar.get(Calendar.YEAR));
}
正如我們所看到的,我們使用add()
方法將一個月添加到給定日期。 Calendar.MONTH
是表示月份的常量。
2.2.使用Date
類
如果我們想要更改特定日期的月份, Date
類是另一個可以考慮的選擇。然而,這種選擇的缺點是該類已被棄用。
讓我們通過測試用例來看看Date
的使用:
@SuppressWarnings("deprecation")
@Test
void givenDate_whenAddingOneMonth_thenDateIsChangedCorrectly() {
Date currentDate = new Date(2023, Calendar.DECEMBER, 20);
Date expectedDate = new Date(2024, Calendar.JANUARY, 20);
currentDate.setMonth(currentDate.getMonth() + 1);
assertEquals(expectedDate, currentDate);
}
正如我們在上面看到的, Date
類提供了 get Month()
方法,該方法返回一個代表月份的數字。此外,我們在返回的數字上加了1
。然後,我們調用setMonth()
用新的月份更新Date
對象。
值得注意的是,始終建議使用 Java 8 的新日期/時間 API,而不是舊的 API。
2.3.使用LocalDate
類
同樣,我們可以使用 Java 8 中引入的LocalDate
類。該類提供了一種簡單明了的方法,通過plusMonths()
方法將月份添加到特定日期:
@Test
void givenJavaLocalDate_whenAddingOneMonth_thenDateIsChangedCorrectly() {
LocalDate localDate = LocalDate.of(2023, 12, 20);
localDate = localDate.plusMonths(1);
assertEquals(1, localDate.getMonthValue());
assertEquals(20, localDate.getDayOfMonth());
assertEquals(2024, localDate.getYear());
}
不出所料,測試用例成功通過。
3. 使用 Joda-Time
如果 Java 8 不可行,我們可以選擇 Joda-Time 庫來實現相同的目標。
首先,我們需要將其依賴添加到pom.xml
文件中:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
Joda-Time 提供了自己版本的LocalDate
類。那麼,讓我們看看如何使用它來添加一個月:
@Test
void givenJodaTimeLocalDate_whenAddingOneMonth_thenDateIsChangedCorrectly() {
org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 12, 20);
localDate = localDate.plusMonths(1);
assertEquals(1, localDate.getMonthOfYear());
assertEquals(20, localDate.getDayOfMonth());
assertEquals(2024, localDate.getYear());
}
正如我們所看到的, LocalDate
也帶有相同的方法plusMonths().
顧名思義,它允許我們添加一定數量的月份,在我們的例子中是1
。
4. 使用 Apache Commons Lang3
或者,我們可以使用 Apache Commons Lang3 庫。像往常一樣,要開始使用這個庫,我們首先需要添加Maven 依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
通常,Apache Commons Lang3 提供DateUtils
實用程序類來執行一系列日期操作。
讓我們通過一個實際示例來看看如何使用它:
@Test
void givenApacheCommonsLangDateUtils_whenAddingOneMonth_thenDateIsChangedCorrectly() {
Date currentDate = new GregorianCalendar(2023, Calendar.APRIL, 20, 4, 0).getTime();
Date expectedDate = new GregorianCalendar(2023, Calendar.MAY, 20, 4, 0).getTime();
assertEquals(expectedDate, DateUtils.addMonths(currentDate, 1));
}
簡而言之,我們使用addMonths()
方法將指定的月份加一。這裡需要注意的重要一點是該方法返回一個新的Date
對象。原來的對象保持不變。
5. 結論
在這篇短文中,我們探討了在 Java 中向當前日期添加一個月的不同方法。
首先,我們了解瞭如何使用核心 Java 類來執行此操作。然後,我們學習瞭如何使用 Joda Time 和 Apache Commons Lang3 等第三方庫來實現相同的目的。
與往常一樣,本文中使用的代碼示例可以在 GitHub 上找到。