LocalDate与LocalTime与LocalDateTime的区别与联系

今天在转化时间的时候出错了,系统首页需要以年,月,日三种分类进行日期统计,因为我平常一直使用LocalDateTime,没有使用过LocalTime和LocalDate,所以在今天我修改日期的时候使用DateTimeFormater格式化字符串将"2024-11-12"转换成LocalDateTime 的时候报错了

代码大致是:

1
2
3
4
5
6
@Test
void testLocalDateTime() {
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDateTime parse = LocalDateTime.parse("2024-11-12", dateTimeFormatter);
System.out.println(parse);
}

错误信息

1
java.time.format.DateTimeParseException: Text '2024-11-12' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {},ISO resolved to 2024-11-12 of type java.time.format.Parsed

至此我才发现LocalDateTime需要精度信息,无法通过"yyyy-MM-dd"来格式化字符串到LocalDateTime

总结

区别

他们三个表示的时间精度不同:

  • LocalDate仅表示日期,不包含具体的时间信息。它可以精确到年、月、日,比如 2024 年 10 月 15 日可以用 LocalDate 来表示。
  • LocalTime仅表示时间,不包含日期信息。能精确到时、分、秒以及纳秒,例如 14:30:00 就可以使用 LocalTime 表示。
  • LocalDateTime同时包含日期和时间信息,它是 LocalDateLocalTime 的组合,能精确到年、月、日、时、分、秒和纳秒,像 2024 - 10 - 15T14:30:00 这样的日期和时间组合就适合用 LocalDateTime 表示。

使用场景不同:

  • LocalDate:适用于只关注日期的场景,如生日、假期安排、账单到期日等。构造时可以使用静态方法 of 传入年、月、日,也可以通过 now() 获取当前日期。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.time.LocalDate;

    public class LocalDateExample {
    public static void main(String[] args) {
    // 获取当前日期
    LocalDate today = LocalDate.now();
    System.out.println("Today: " + today);
    // 指定日期
    LocalDate specificDate = LocalDate.of(2024, 10, 15);
    System.out.println("Specific date: " + specificDate);
    }
    }
  • LocalTime:常用于只关心时间点的场景,如会议开始时间、商店营业时间等。可以使用 of 方法传入时、分、秒等参数来构造,也可以用 now() 获取当前时间。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.time.LocalTime;

    public class LocalTimeExample {
    public static void main(String[] args) {
    // 获取当前时间
    LocalTime now = LocalTime.now();
    System.out.println("Now: " + now);
    // 指定时间
    LocalTime specificTime = LocalTime.of(14, 30);
    System.out.println("Specific time: " + specificTime);
    }
    }
  • LocalDateTime:适用于需要同时记录日期和时间的场景,如事件发生的具体时刻、系统日志记录的时间戳等。构造时同样可以使用 of 方法结合日期和时间信息,或者用 now() 获取当前的日期和时间。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import java.time.LocalDateTime;

    public class LocalDateTimeExample {
    public static void main(String[] args) {
    // 获取当前日期和时间
    LocalDateTime currentDateTime = LocalDateTime.now();
    System.out.println("Current date and time: " + currentDateTime);
    // 指定日期和时间
    LocalDateTime specificDateTime = LocalDateTime.of(2024, 10, 15, 14, 30);
    System.out.println("Specific date and time: " + specificDateTime);
    }
    }

联系

继承关系:它们都实现了 Temporal 接口,并且继承自 TemporalAccessor 接口。这意味着它们都具备一些通用的时间访问和操作方法,例如可以通过这些接口方法来查询日期或时间的各个字段(如年、月、日、时等)。

相互转换

  • LocalDateLocalDateTimeLocalDate 可以通过 atTime 方法结合 LocalTime 转换为 LocalDateTimeLocalDateTime 可以通过 toLocalDate 方法提取出 LocalDate

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public static void main(String[] args) {
    LocalDate localDate = LocalDate.of(2024, 10, 15);
    LocalTime localTime = LocalTime.of(14, 30);
    // LocalDate 转 LocalDateTime
    LocalDateTime localDateTime = localDate.atTime(localTime);
    System.out.println("Converted to LocalDateTime: " + localDateTime);

    // LocalDateTime 转 LocalDate
    LocalDate extractedDate = localDateTime.toLocalDate();
    System.out.println("Extracted LocalDate: " + extractedDate);
    }
  • LocalTimeLocalDateTimeLocalTime 可以通过 atDate 方法结合 LocalDate 转换为 LocalDateTimeLocalDateTime 可以通过 toLocalTime 方法提取出 LocalTime

操作方法联系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void main(String[] args) {
LocalDate localDate = LocalDate.of(2024, 10, 15);
// 日期加一天
LocalDate newDate = localDate.plusDays(1);
System.out.println("New date: " + newDate);

LocalTime localTime = LocalTime.of(14, 30);
// 时间减一小时
LocalTime newTime = localTime.minusHours(1);
System.out.println("New time: " + newTime);

LocalDateTime localDateTime = LocalDateTime.of(2024, 10, 15, 14, 30);
// 修改月份
LocalDateTime newDateTime = localDateTime.withMonth(11);
System.out.println("New date and time: " + newDateTime);
}