在 Java 中從月份名稱取得月份號
1. 概述
在 Java 中處理月份時,我們經常利用數字格式,因為它有助於在不同語言和地區之間實現標準化,因為月份名稱差異很大。
在這個簡短的教學中,我們將學習將月份名稱轉換為其對應數字的不同方法。首先,我們將了解如何使用 JDK 來執行此操作。然後,我們將討論如何使用第三方 Joda-Time 函式庫實現相同的結果。
2. 使用 Java 8+ 日期時間 API
Java 8 因其引入新的 Date-Time API 而經常受到讚揚,該 API 旨在解決舊版日期 API 的缺點。那麼,讓我們看看如何使用這個新的 API 來回答我們的核心問題。
2.1.使用Month
最簡單的解決方案是使用Month
枚舉。顧名思義,它模擬一年中的 12 個月。除了文字名稱之外,每個常數還有一個從 1(一月)到 12(十二月)的int
值。
那麼,讓我們看看它的實際效果:
@Test
void givenMonthName_whenUsingMonthEnum_thenReturnNumber() {
String givenMonthName = "October";
int expectedMonthNumber = 10;
int monthNumber = Month.valueOf(givenMonthName.toUpperCase())
.getValue();
assertEquals(expectedMonthNumber, monthNumber);
}
正如我們在上面看到的,我們使用valueOf()
方法來取得傳遞的月份名稱的int
值。由於它是一個枚舉,因此我們在呼叫valueOf()
之前使用toUpperCase()
方法將輸入轉換為大寫。
2.2.使用ChronoField
ChronoField
是另一個枚舉,我們可以用它來取得給定月份的數字。它表示一組標準字段,可提供對天、月和年等時間資訊的存取。
那麼,讓我們在實踐中來看看:
@Test
void givenMonthName_whenUsingChronoFieldEnum_thenReturnNumber() {
String givenMonthName = "Sep";
int expectedMonthNumber = 9;
int monthNumber = DateTimeFormatter.ofPattern("MMM")
.withLocale(Locale.ENGLISH)
.parse(givenMonthName)
.get(ChronoField.MONTH_OF_YEAR);
assertEquals(expectedMonthNumber, monthNumber);
}
正如我們所看到的,我們使用了MMM
格式,它是使用三個字元的月份的縮寫形式。然後,我們將MONTH_OF_YEAR
常數傳遞給get()
方法。這樣我們就得到了給定月份“Sep”
的數字。
3. 使用舊版日期 API
在 Java 8 之前,我們通常使用Date
或Calendar
來操作或使用時間物件。那麼,讓我們深入了解如何使用這些遺留類別將月份名稱轉換為其對應的數字:
@Test
void givenMonthName_whenUsingDateLegacyAPI_thenReturnNumber() throws ParseException {
String givenMonthName = "May";
int expectedMonthNumber = 5;
Date date = new SimpleDateFormat("MMM", Locale.ENGLISH).parse(givenMonthName);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int monthNumber = calendar.get(Calendar.MONTH) + 1;
assertEquals(expectedMonthNumber, monthNumber);
}
在這裡,我們使用SimpleDateFormat
和MMM
模式將縮寫的月份名稱解析為Date
物件。此外,我們建立一個Calendar
實例,並將代表解析月份的Date
物件設定為日曆的時間。
最後,我們使用get()
方法從日曆中檢索月份。通常, Calendar.MONTH
是從零開始的(一月是 0,二月是 1 等),因此我們加1
以獲得正確的月份數字。
4. 使用 Joda-Time
Joda-Time 是應對我們挑戰的另一種選擇。首先,我們將其依賴項新增到pom.xml
檔案中:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.7</version>
</dependency>
類似地,Joda-Time 提供了一個名為getMonthOfYear()
的便捷方法,我們可以使用它來獲取給定月份的數字:
@Test
void givenMonthName_whenUsingJodaTime_thenReturnNumber() {
String givenMonthName = "April";
int expectedMonthNumber = 4;
int monthNumber = DateTimeFormat.forPattern("MMM")
.withLocale(Locale.ENGLISH)
.parseDateTime(givenMonthName)
.getMonthOfYear();
assertEquals(expectedMonthNumber, monthNumber);
}
如圖所示,邏輯與之前看到的相同。在這裡,我們使用getMonthOfYear()
來取得解析的月份名稱的數值。
5. 結論
在這篇短文中,我們探索了將月份名稱轉換為其對應數字的不同方法。
首先,我們了解如何使用 JDK 進行轉換。然後,我們學習如何使用 Joda-Time 庫實現相同的結果。
與往常一樣,本文中使用的程式碼可以在 GitHub 上找到。