在 Java 中使用目前時間作為檔案名
一、簡介
在本教程中,我們將了解幾種在 Java 中取得當前時間戳記值並將其用作檔案名稱的方法。
為了實現我們的目標,我們將利用 Java DateTime API 和第三方程式庫(例如 Joda-Time)中的多個類別。
2. 初始設定
在後面的部分中,我們將建立幾個測試案例,展示獲取當前時間戳並將其用作檔案名稱的每種方法。
但是,要將時間戳值轉換為指定的字串格式,我們首先需要指定時間戳格式,然後使用它來定義格式化程式類別:
static final String TIMESTAMP_FORMAT = "yyyyMMddHHmmss";
static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern(TIMESTAMP_FORMAT);
static final SimpleDateFormat SIMPLEDATE_FORMAT = new SimpleDateFormat(TIMESTAMP_FORMAT);
接下來,我們將編寫一個方法,將當前時間值轉換為有效的檔案名稱。此方法的範例輸出將類似於“ 20231209122307.txt
”:
String getFileName(String currentTime) {
return MessageFormat.format("{0}.txt", currentTime);
}
由於我們正在編寫測試案例,因此我們將建立另一個方法來檢查輸出檔案名稱是否包含格式正確的時間戳記:
boolean verifyFileName(String fileName) {
return Pattern
.compile("[0-9]{14}+\\.txt", Pattern.CASE_INSENSITIVE)
.matcher(fileName)
.matches();
}
在這種情況下,我們的檔案名稱由代表時間戳記的數字組成。建議確保檔案名稱格式避免使用檔案名稱中禁止的字符,這些字符特定於相應的作業系統。
3. 使用 Java DateTime API 取得目前時間
Java 提供了諸如Calendar
和Date
之類的遺留類別來處理日期和時間資訊。然而,由於設計缺陷,Java 8 DateTime API 引入了新的類別。 Date
、 Calendar
和SimpleDateFormatter
類別是可變的且不是線程安全的。
我們將首先查看遺留類別Calendar
和Date
來產生時間戳記並獲得基本的了解,然後了解 Java 8 DateTime API 類,例如Instant, LocalDateTime, ZonedDateTime,
和OffsetDateTime
。
值得注意的是,對於較新的 Java 程序,建議使用 Java 8 DateTime API 類,而不是舊版 Java 日期和時間類。
3.1.使用Calendar
最基本的方法是使用Calendar.getInstance()
方法,該方法傳回使用預設時區和區域設定的Calendar
實例。此外, getTime()
方法為我們提供了以毫秒為單位的時間值:
@Test
public void whenUsingCalender_thenGetCurrentTime() {
String currentTime = SIMPLEDATE_FORMAT.format(Calendar.getInstance().getTime());
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
SimpleDateFormatter
類別可以將時間值轉換為適當的時間戳記格式。
3.2.使用Date
類似地,我們可以建構一個Date
類別的對象,以毫秒為單位表示對象的創建時間。 SimpleDateFormatter
將毫秒時間值轉換為所需的字串模式:
@Test
public void whenUsingDate_thenGetCurrentTime() {
String currentTime = SIMPLEDATE_FORMAT.format(new Date());
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
建議使用我們將在下一節中看到的新 Java 8 類別。
3.3.使用Instant
在 Java 中, Instant
類別表示 UTC 時間軸上的單一時刻:
@Test
public void whenUsingInstant_thenGetCurrentTime() {
String currentTime = Instant
.now()
.truncatedTo(ChronoUnit.SECONDS)
.toString()
.replaceAll("[:TZ-]", "");
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
Instant.now()
方法詢問系統時鐘當下時刻。我們可以使用truncatedTo()
方法將數值四捨五入到最接近的秒數。然後可以將第二個值變更為字串,以替換時間戳中時區資訊中的任何不需要的字元。
3.4.使用LocalDateTime
LocalDateTime
表示 ISO-8601 日曆系統中沒有時區的日期和時間:
@Test
public void whenUsingLocalDateTime_thenGetCurrentTime() {
String currentTime = LocalDateTime.now().format(DATETIME_FORMATTER);
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
LocalDateTime.now()
方法查詢預設系統時鐘以提供日期時間資訊。然後我們可以傳遞一個DateTimeFormatter
將時間戳格式化為字串
3.5.使用ZonedDateTime
ZonedDateTime
是帶有時區的日期時間的不可變表示形式:
@Test
public void whenUsingZonedDateTime_thenGetCurrentTime() {
String currentTime = ZonedDateTime
.now(ZoneId.of("Europe/Paris"))
.format(DATETIME_FORMATTER);
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
時區識別碼能夠唯一標識地球上的特定地理位置,例如“ Europe/Paris
”。使用此標識,我們可以獲得ZoneId
,它確定用於從 Instant 到LocalDateTime.
ZonedDateTime
自動處理全年夏令時 (DST) 調整。
3.6.使用OffsetDateTime
OffsetDateTime
是忽略時區的ZonedDateTime
的簡化版本。世界不同地區的時區偏移量有所不同。例如,「 +2:00
」表示某個時區的時間比 UTC 晚兩小時。我們可以透過使用ZoneOffSet
偏移值來更改 UTC 中的預設時間:
@Test
public void whenUsingOffsetDateTime_thenGetCurrentTime() {
String currentTime = OffsetDateTime
.of(LocalDateTime.now(), ZoneOffset.of("+02:00"))
.format(DATETIME_FORMATTER);
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
ZonedDateTime
和OffsetDateTime
都儲存時間軸的瞬間,精確度高達奈秒。了解它們的差異有助於我們在它們之間進行選擇。
4. Joda-Time 的當前時間
Joda-Time 是一個著名的日期和時間處理庫。它是開發人員中最受歡迎的程式庫之一,可以取代麻煩的遺留 Java 類別。它使用不可變類別處理日期和時間值。
讓我們在pom.xml
中加入 Joda-Time Maven依賴項:
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.12.5</version>
</dependency>
4.1.使用 Joda DateTime
DateTime.now()
方法使用預設時區取得設定為目前系統毫秒時間的DateTime
。然後我們可以將其轉換為具有定義的時間戳格式的String
:
@Test
public void whenUsingJodaTime_thenGetCurrentTime() {
String currentTime = DateTime.now().toString(TIMESTAMP_FORMAT);
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
4.2.使用 Joda Instant
Joda-Time 庫還提供Instant
類別來捕捉當前時間軸中的時刻。我們可以使用DateTimeFormat
將時間戳記轉換為所需的字串模式:
@Test
public void whenUsingJodaTimeInstant_thenGetCurrentTime() {
String currentTime = DateTimeFormat
.forPattern(TIMESTAMP_FORMAT)
.print(org.joda.time.Instant.now().toDateTime());
String fileName = getFileName(currentTime);
assertTrue(verifyFileName(fileName));
}
5. 結論
在本文中,我們發現了在 Java 程式中取得當前時間戳記的多種方法,並利用它們來產生檔案名稱。我們透過使用各種 Java DateTime API 類別和 Joda-Time 庫來獲取當前時間戳記。
與往常一樣,本文的完整程式碼可以在 GitHub 上找到。