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

合并 LocalDateLocalTime 的本质是创建新的 LocalDateTime 对象。接下来我们将探讨几种实现方式。

4. 3. 使用 LocalDateTime.of() 方法

最直接的合并方式是使用 LocalDateTime.of() 静态方法。该方法接收 LocalDateLocalTime 参数,返回合并后的 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);
}

关键步骤说明:

  1. 初始化原始日期(2024-09-18)和时间(14:45)
  2. ⚠️ 使用 TemporalAdjuster 将分钟归零,得到调整后时间(14:00)
  3. 合并调整后的时间与日期
  4. 验证合并结果是否符合预期

此方案展示了合并前预处理时间的灵活性,适用于需要时间格式化的场景。

7. 6. 总结

合并 Java 中的日期和时间主要有两种推荐方式:

  • LocalDateTime.of():最简单直接的合并方案
  • LocalDate.atTime():适合链式调用的优雅方案

当需要时间预处理时,可结合 TemporalAdjuster 实现灵活调整。这些方法都能高效地将分离的日期时间组件整合为统一的 LocalDateTime 对象。

完整示例代码可在 GitHub 获取。