2. 1. 引言
在 Java 开发中,我们经常需要处理来自不同来源的分离日期和时间数据。当需要将 LocalDate
(日期)和 LocalTime
(时间)合并为单个 LocalDateTime
对象时,掌握高效的合并方法至关重要。
本文将介绍 Java 8+ 中使用 java.time
包合并日期和时间的多种方案。这个包提供了直观的日期时间 API,能优雅地解决这类问题。
3. 2. 理解 Java 中的日期时间类
Java 8 引入了三个核心日期时间类,各有明确用途:
- ✅
LocalDate
:仅表示日期(如2023-09-12
),不含时间信息 - ✅
LocalTime
:仅表示时间(如14:30
),不含日期信息 - ✅
LocalDateTime
:组合日期和时间(如2023-09-12T14:30
)
合并 LocalDate
和 LocalTime
的本质是创建新的 LocalDateTime
对象。接下来我们将探讨几种实现方式。
4. 3. 使用 LocalDateTime.of() 方法
最直接的合并方式是使用 LocalDateTime.of()
静态方法。该方法接收 LocalDate
和 LocalTime
参数,返回合并后的 LocalDateTime
。
先初始化测试数据:
LocalDate date = LocalDate.of(2023, 9, 12);
LocalTime time = LocalTime.of(14, 30);
LocalDateTime expectedDateTime = LocalDateTime.parse("2023-09-12T14:30");
合并示例:
@Test
public void givenDateAndTime_whenUsingLocalDateTimeOf_thenCombined() {
LocalDateTime combinedDateTime = LocalDateTime.of(date, time);
assertEquals(expectedDateTime, combinedDateTime);
}
LocalDateTime.of()
是最简洁的合并方案,直接将日期和时间组件融合为统一对象。
5. 4. 使用 LocalDate.atTime() 方法
另一种实用方案是在 LocalDate
实例上调用 atTime()
方法:
@Test
public void givenDateAndTime_whenUsingAtTime_thenCombined() {
LocalDateTime combinedDateTime = date.atTime(time);
assertEquals(expectedDateTime, combinedDateTime);
}
这种方法特别适合在已有 LocalDate
对象时使用,通过链式调用完成合并,代码更流畅。
6. 5. 使用 TemporalAdjuster 灵活调整
有时合并前需要先调整时间,例如将时间截断到整点。这时可借助 TemporalAdjuster
:
@Test
public void givenDateAndTime_whenAdjustingTime_thenCombined() {
LocalDate date = LocalDate.of(2024, 9, 18);
LocalTime originalTime = LocalTime.of(14, 45);
LocalTime adjustedTime = originalTime.with(ChronoField.MINUTE_OF_HOUR, 0);
LocalDateTime expectedAdjustedDateTime = LocalDateTime.of(date, adjustedTime);
LocalDateTime actualDateTime = date.atTime(adjustedTime);
assertEquals(expectedAdjustedDateTime, actualDateTime);
}
关键步骤说明:
- 初始化原始日期(2024-09-18)和时间(14:45)
- ⚠️ 使用
TemporalAdjuster
将分钟归零,得到调整后时间(14:00) - 合并调整后的时间与日期
- 验证合并结果是否符合预期
此方案展示了合并前预处理时间的灵活性,适用于需要时间格式化的场景。
7. 6. 总结
合并 Java 中的日期和时间主要有两种推荐方式:
- ✅
LocalDateTime.of()
:最简单直接的合并方案 - ✅
LocalDate.atTime()
:适合链式调用的优雅方案
当需要时间预处理时,可结合 TemporalAdjuster
实现灵活调整。这些方法都能高效地将分离的日期时间组件整合为统一的 LocalDateTime
对象。
完整示例代码可在 GitHub 获取。