Java8 教程

Java8 TemporalAdjusters 日期校正器

TemporalAdjusters 是 Java8 中用于日期和时间操作的一个工具类,它通过静态方法提供了大量常用的 TemporalAdjuster 对象,以便执行各种日期校正操作。TemporalAdjuster 是一个函数式接口,其中定义了一个抽象方法 adjustInto(Temporal temporal),用于调整指定的 Temporal 对象。TemporalAdjuster 源码如下:

Java8 TemporalAdjusters 日期校正器

TemporalAdjusters 常用方法

TemporalAdjusters 类提供的预定义静态方法如下:

  • firstDayOfMonth():获取当前月的第一天。

  • firstDayOfNextMonth():获取下月的第一天。

  • firstDayOfNextYear():获取明年的第一天。

  • firstDayOfYear():获取当年的第一天。

  • lastDayOfMonth():获取当月的最后一天,无需再计算当月是 28、29、30 还是 31 天。

  • lastDayOfNextMonth():获取下月的最后一天。

  • lastDayOfNextYear():获取明年的最后一天。

  • lastDayOfYear():获取当年的最后一天。

  • firstInMonth(DayOfWeek dayOfWeek):获取当月的第一个指定星期几。

  • lastInMonth(DayOfWeek dayOfWeek):获取当月的最后一个指定星期几。

  • dayOfWeekInMonth(int week, DayOfWeek dayOfWeek):获取当月第week周的指定星期几。

  • next(DayOfWeek dayOfWeek):获取当前日期之后(不包括当天)的第一个指定星期几的日期。如果当天就是该星期几,则返回下一周的该日。

  • nextOrSame(DayOfWeek dayOfWeek):获取当前日期之后(包括当天)的第一个指定星期几的日期。如果当天就是该星期几,则返回当天日期。

  • previous(DayOfWeek dayOfWeek):获取当前日期之前(不包括当天)的第一个指定星期几的日期。如果今天是该星期几,则返回上一周的该日。

  • previousOrSame(DayOfWeek dayOfWeek):获取当前日期之前(包括当天)的第一个指定星期几的日期。如果今天是该星期几,则返回当天日期。

TemporalAdjusters 示例

校正器简单用法

该示例将介绍如何简单使用日期校正器 TemporalAdjusters,如查找本月最后一天、或者本月第一天。例如:

package com.hxstrive.jdk8.date_time.temporalAdjusters;

import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

/**
 * TemporalAdjusters 类
 * @author hxstrive.com
 */
public class TemporalAdjustersDemo1 {

    public static void main(String[] args) {
        // 查找当前日期后第一个星期二
        LocalDate firstTuesday = LocalDate.now()
                .with(TemporalAdjusters.nextOrSame(DayOfWeek.TUESDAY));
        System.out.println(firstTuesday); //2024-07-02

        // 查找本月最后一天
        LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
        System.out.println(lastDay); //2024-06-30

        // 查找本月第一天
        LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth());
        System.out.println(firstDay); //2024-06-01
    }

}

自定义日期校正器

你可以通过实现 TemporalAdjuster 接口来实现自己的校正器。例如:

package com.hxstrive.jdk8.date_time.temporalAdjusters;

import java.time.LocalDate;
import java.time.temporal.TemporalAdjuster;

/**
 * TemporalAdjusters 类
 * @author hxstrive.com
 */
public class TemporalAdjustersDemo2 {

    public static void main(String[] args) {
        // 通过实现 TemporalAdjuster 接口来实现自己的校正器
        // 下面是计算下一个工作日的校正器
        TemporalAdjuster NEXT_WORKDAY = w -> {
            LocalDate result = (LocalDate) w;
            do {
                result = result.plusDays(1);
            } while (result.getDayOfWeek().getValue() >= 6);
            return result;
        };

        LocalDate backToWork = LocalDate.now().with(NEXT_WORKDAY);
        System.out.println(backToWork); //2024-07-01
    }

}

注意,lambda 表达式的参数类型为 Temporal,它必须被强制转换为 LocalDate 对象。你可以通过 ofDateAdjuster 方法以及一个 Unaryoperator<LocalDate> 的 lambda 表达式,来避免该强制转换。例如:

package com.hxstrive.jdk8.date_time.temporalAdjusters;

import java.time.LocalDate;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;

/**
 * TemporalAdjusters 类
 * @author hxstrive.com
 */
public class TemporalAdjustersDemo3 {

    public static void main(String[] args) {
        // 通过实现 TemporalAdjuster 接口来实现自己的校正器
        // 下面是计算下一个工作日的校正器
        TemporalAdjuster NEXT_WORKDAY = TemporalAdjusters.ofDateAdjuster(w ->{
                LocalDate result = w; // 不需要进行转换
            do {
                result = result.plusDays(1);
            } while(result.getDayOfWeek().getValue() >= 6);
            return result;
        });

        LocalDate backToWork = LocalDate.now().with(NEXT_WORKDAY);
        System.out.println(backToWork); //2024-07-01
    }

}
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号