📌  相关文章
📜  Java中的 LocalDateTime with() 方法及示例(1)

📅  最后修改于: 2023-12-03 15:16:24.300000             🧑  作者: Mango

Java中的 LocalDateTime with() 方法及示例

简介

LocalDateTime 是 Java 中的一个日期时间类,用于表示一个不带时区的日期时间,其内部维护了年月日时分秒这些信息。而 with() 方法是 LocalDateTime 类中的一个修饰方法,用于在不更改原有对象的情况下获得一个新的对象,从而修改日期时间的某些属性。该方法实现了不可变性,不会改变原有对象的值,是函数式编程和不可变对象的一个典型案例。

方法签名
LocalDateTime with(TemporalAdjuster adjuster)
参数说明

adjuster: 一个 TemporalAdjuster 类型的对象,表示调整 LocalDateTime 对象的方式。TemporalAdjuster 是一个函数式接口,用于实现时间调整逻辑。

返回值

LocalDateTime 对象。该方法会返回一个全新的 LocalDateTime 对象,其年月日时分秒等属性将会根据 adjuster 参数进行调整。

示例代码
1. 修改年份为 2022 年
LocalDateTime now = LocalDateTime.now();
LocalDateTime newDateTime = now.withYear(2022);
System.out.println("原日期时间:" + now); // 原日期时间:2021-10-14T19:30:24.819556
System.out.println("新日期时间:" + newDateTime); // 新日期时间:2022-10-14T19:30:24.819556
2. 修改月份为 12 月
LocalDateTime now = LocalDateTime.now();
LocalDateTime newDateTime = now.withMonth(12);
System.out.println("原日期时间:" + now); // 原日期时间:2021-10-14T19:30:24.819556
System.out.println("新日期时间:" + newDateTime); // 新日期时间:2021-12-14T19:30:24.819556
3. 修改日期为 25 日
LocalDateTime now = LocalDateTime.now();
LocalDateTime newDateTime = now.withDayOfMonth(25);
System.out.println("原日期时间:" + now); // 原日期时间:2021-10-14T19:30:24.819556
System.out.println("新日期时间:" + newDateTime); // 新日期时间:2021-10-25T19:30:24.819556
4. 修改小时数为 9 点
LocalDateTime now = LocalDateTime.now();
LocalDateTime newDateTime = now.withHour(9);
System.out.println("原日期时间:" + now); // 原日期时间:2021-10-14T19:30:24.819556
System.out.println("新日期时间:" + newDateTime); // 新日期时间:2021-10-14T09:30:24.819556
5. 修改分钟数为 40 分钟
LocalDateTime now = LocalDateTime.now();
LocalDateTime newDateTime = now.withMinute(40);
System.out.println("原日期时间:" + now); // 原日期时间:2021-10-14T19:30:24.819556
System.out.println("新日期时间:" + newDateTime); // 新日期时间:2021-10-14T19:40:24.819556
6. 自定义修改方式
LocalDateTime now = LocalDateTime.now();
LocalDateTime newDateTime = now.with(temporal -> {
    int year = temporal.get(ChronoField.YEAR);
    int month = temporal.get(ChronoField.MONTH_OF_YEAR);
    int dayOfMonth = temporal.get(ChronoField.DAY_OF_MONTH);
    int hour = temporal.get(ChronoField.HOUR_OF_DAY);
    int minute = temporal.get(ChronoField.MINUTE_OF_HOUR);
    int second = temporal.get(ChronoField.SECOND_OF_MINUTE);

    LocalDateTime modifiedDateTime = LocalDateTime.of(year, month, dayOfMonth, hour, minute, second);
    modifiedDateTime = modifiedDateTime.plusDays(1);
    modifiedDateTime = modifiedDateTime.withHour(12);
    return modifiedDateTime;
});

System.out.println("原日期时间:" + now); // 原日期时间:2021-10-14T19:30:24.819556
System.out.println("新日期时间:" + newDateTime); // 新日期时间:2021-10-15T12:30:24.819556

上述代码中,自定义了 TemporalAdjuster 对象,在其 with() 方法中使用了多次的链式调用,实现了自定义的时间调整逻辑。