在 Java 中獲取昨天的日期
1. 概述
在這個簡短的教程中,我們將探索在 Java 中獲取昨天日期的不同方法。
首先,我們將解釋如何使用核心 Java 來做到這一點。然後,我們將演示如何使用 Joda-Time 和 Apache Commons Lang 等外部庫來解決我們的主要難題。
2. Java 8之前
在 Java 8 之前,我們通常使用Date
或Calendar
來處理和操作日期/時間信息。那麼,讓我們看看如何使用這兩個類來獲取昨天的日期。
2.1.使用Date
Date
類表示特定的時刻。它提供了一組方法來操作和檢索有關日期的信息。然而,值得一提的是,這個類已經過時並被標記為 deprecated 。
那麼,讓我們看看實際情況:
@Test
void givenDate_whenUsingDateClass_thenReturnYesterday() {
Date date = new Date(2023, Calendar.DECEMBER, 20);
Date yesterdayDate = new Date(date.getTime() - 24 * 60 * 60 * 1000);
Date expectedYesterdayDate = new Date(2023, Calendar.DECEMBER, 19);
assertEquals(expectedYesterdayDate, yesterdayDate);
}
正如我們所看到的,我們使用getTime()
方法來獲取給定日期的毫秒數。然後,我們減去一天,即 24 * 60 * 60 * 1000 毫秒。
2.2.使用Calendar
如果我們想使用舊的 API, Calendar
是另一個可以考慮的選擇。此類提供了一組管理時間數據(例如天和月)的方法。
例如,我們可以使用add()
方法添加一定的天數。由於我們想要獲取昨天的日期,因此需要指定 -1 作為值。
那麼,讓我們在實踐中看看:
@Test
void givenDate_whenUsingCalendarClass_thenReturnYesterday() {
Calendar date = new GregorianCalendar(2023, Calendar.APRIL, 20, 4, 0);
date.add(Calendar.DATE, -1);
Calendar expectedYesterdayDate = new GregorianCalendar(2023, Calendar.APRIL, 19, 4, 0);
assertEquals(expectedYesterdayDate, date);
}
正如所料,測試成功通過。
3.Java 8 日期時間 API
Java 8 經常因其新的日期時間功能而受到稱讚。該 API 附帶了許多現成的類和方法,用於以更簡潔和人性化的方式計算日期和時間。那麼,讓我們仔細看看如何使用新的 Date-Time API 來獲取昨天的日期。
3.1.使用LocalDate
最簡單的解決方案之一是使用LocalDate
類。它提供了minusDays()
方法來從給定日期中減去特定的天數。在我們的例子中,我們需要減去一天。
現在,讓我們通過一個測試用例來舉例說明LocalDate.minusDays()
的使用:
@Test
void givenDate_whenUsingLocalDateClass_thenReturnYesterday() {
LocalDate localDate = LocalDate.of(2023, 12, 20);
LocalDate yesterdayDate = localDate.minusDays(1);
LocalDate expectedYesterdayDate = LocalDate.of(2023, 12, 19);
assertEquals(expectedYesterdayDate, yesterdayDate);
}
如上所示, minusDays(1)
返回一個新的LocalDate
對象,表示昨天。
3.2.使用Instant
另一個解決方案是使用Instant
類。顧名思義,它對時間線中的特定時間點進行建模。通常, Instant
類附帶minus()
方法,我們可以使用該方法減去特定的毫秒數。
那麼,讓我們用一個實際的例子來說明如何使用它來獲取昨天的日期:
@Test
void givenDate_whenUsingInstantClass_thenReturnYesterday() {
Instant date = Instant.parse("2023-10-25");
Instant yesterdayDate = date.minus(24 * 60 * 60 * 1000);
Instant expectedYesterdayDate = Instant.parse("2023-10-24");
assertEquals(expectedYesterdayDate, yesterdayDate);
}
正如我們前面提到的,24 * 60 * 60 * 1000 代表一天,以毫秒為單位。所以在這裡,我們從給定日期中減去一天。
4. 使用 Joda-Time
同樣,我們可以使用 Joda-Time API 來回答我們的核心問題。首先,我們需要將其依賴添加到pom.xml
文件中:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10</version>
</dependency>
Joda-Time 是 Java 8 發布之前日期和時間操作的事實上的標準。它提供了自己的LocalDate
類版本。那麼,讓我們在實踐中看看:
@Test
void givenDate_whenUsingJodaTimeLocalDateClass_thenReturnYesterday() {
org.joda.time.LocalDate localDate = new org.joda.time.LocalDate(2023, 12, 20);
org.joda.time.LocalDate yesterdayDate = localDate.minusDays(1);
org.joda.time.LocalDate expectedYesterdayDate = new org.joda.time.LocalDate(2023, 12, 19);
assertEquals(expectedYesterdayDate, yesterdayDate);
}
簡而言之,該類提供了minusDays()
完全相同的方法,我們可以使用該方法減去特定天數,如其名稱所示。
5. 使用 Apache Commons Lang3
另一方面,我們可以選擇 Apache Commons Lang3 庫。與往常一樣,我們需要在開始使用之前添加Maven 依賴項:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
現在,讓我們演示如何使用這個庫來獲取昨天的日期:
@Test
void givenDate_whenUsingApacheCommonsLangDateUtils_thenReturnYesterday() {
Date date = new GregorianCalendar(2023, Calendar.MAY, 16, 4, 0).getTime();
Date yesterdayDate = DateUtils.addDays(date, -1);
Date expectedYesterdayDate = new GregorianCalendar(2023, Calendar.MAY, 15, 4, 0).getTime();
assertEquals(expectedYesterdayDate, yesterdayDate);
}
Apache Commons Lang3 庫提供了用於日期時間操作的DateUtils()
類。該實用程序類提供addDays()
方法來添加天數,在我們的示例中為 -1 。
請注意,該方法返回一個新的Date
對象。原定日期保持不變。
六,結論
在這篇短文中,我們詳細解釋瞭如何用 Java 獲取昨天的日期。在整個課程中,我們演示瞭如何使用核心 Java 類來做到這一點。然後,我們展示瞭如何使用 Apache Commons Lang3 和 Joda-Time 等外部庫。
與往常一樣,本文中使用的代碼可以在 GitHub 上找到。