3.1_28_1 JDK8新特性【Date】之DayOfWeek 星期枚举

相关链接


5. 新API详解


id=2 DayOfWeek 星期枚举

id类名作用
2 Enum DayOfWeek  一个不可变的日期时间对象,表示星期几
  默认格式: 英文大写
  实例: MONDAY

  DayOfWeek枚举类 -> DayOfWeek.of 可以根据传入的数字返回对应的星期枚举。

    public static void main(String[] args) {
        //DayOfWeek枚举类 -> of可以根据传入的数字返回对应的星期枚举
        DayOfWeek dayOfWeek = DayOfWeek.of(5);
    }

  可以通过 -> getDisplayName(TextStyle style, Locale locale) ,按照指定格式输出文本"星期几"

    public static void main(String[] args) {
        DayOfWeek dayOfWeek = DayOfWeek.of(5);
        //可以通过 -> getDisplayName(TextStyle style, Locale locale) ,按照指定格式输出文本"星期几"
        String displayName = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.CHINESE);
        //星期五
        System.out.println(displayName);
    }

  可以作为 -> with 方法的参数调节日期,例如:获取"下个星期五"的日期

    public static void main(String[] args) {
        LocalDateTime ldt = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
        //可以作为 -> with 方法的参数调节日期,例如:获取"下个星期五"的日期
        TemporalAdjuster previous = TemporalAdjusters.next(DayOfWeek.of(5));
        LocalDateTime nextFriday = ldt.with(previous);
        //2022-01-01T00:00是星期六,他的下一个周五日期是2022-01-07T00:00
        System.out.println(ldt + "是" + ldt.getDayOfWeek().
                getDisplayName(TextStyle.FULL, Locale.CHINESE) +
                                   ",他的下一个周五日期是" + nextFriday);
    }

   除next方法外,DayOfWeek还出现在TemporalAdjsters的以下方法中

id类名作用
19TemporalAdjusters
调节器
  类中所有方法都会返回一个 TemporalAdjuster 对象。
  表示一些 常用时间节点,供时间计算。(常用 g. 日期调节器 with:作为*.with的参数,按照一些特殊规则计算时间)
  例如: 上一个星期几(TemporalAdjusters.previous(DayOfWeek dayOfWeek)
      上一个星期几或当天(TemporalAdjusters.previousOrSame(DayOfWeek dayOfWeek)
      下一个星期几(TemporalAdjusters.next(DayOfWeek dayOfWeek)
      下一个星期几或当天(TemporalAdjusters.nextOrSame(DayOfWeek dayOfWeek)
      当月第1天(TemporalAdjusters.firstDayOfMonth()
      当月最后1天(TemporalAdjusters.lastDayOfMonth()()
      当月第1个星期几(TemporalAdjusters.firstInMonth(DayOfWeek dayOfWeek)
      当月第n个星期几(TemporalAdjusters.dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)
      当月最后一个星期几(TemporalAdjusters.lastInMonth(DayOfWeek dayOfWeek)
      当年最后1天(TemporalAdjusters.lastDayOfYear()
      明年的第1天(TemporalAdjusters.firstDayOfNextYear()
      下月第1天(TemporalAdjusters.firstDayOfNextMonth()
      lambda表达式自定义指定日期(TemporalAdjusters.
                ofDateAdjuster(UnaryOperator<LocalDate> dateBasedAdjuster)
  实例: 获取举例今天100年以后的日期
      LocalDate DecadesFromNow = LocalDate.now().plus(1,ChronoUnit.DECADES);
--------------------------------------------------------------------------------------
  Class TemporalAdjusters 并不是 interface TemporalAdjuster 的实现类,只不过 Class TemporalAdjusters 的静态方法实现了 interface TemporalAdjuster,并返回 interface TemporalAdjuster 对象的实例

  可以作为判断条件 -> with 方法中自定义接口,实现同样功能:获取"下个星期五"的日期。

    public static void main(String[] args) {
        LocalDateTime ldt = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
        //可以作为判断条件 -> with 方法中自定义接口,实现同样功能:获取"下个星期五"的日期。
        LocalDateTime nextFriday = ldt.with(new TemporalAdjuster() {
            @Override
            public Temporal adjustInto(Temporal temporal) {
                //获取当前日期是星期几
                int i = temporal.get(ChronoField.DAY_OF_WEEK);
                DayOfWeek dayOfWeekNow = DayOfWeek.of(i);
                if (dayOfWeekNow == DayOfWeek.MONDAY) return temporal.plus(4, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.TUESDAY) return temporal.plus(3, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.WEDNESDAY) return temporal.plus(2, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.THURSDAY) return temporal.plus(1, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.FRIDAY) return temporal;
                else if (dayOfWeekNow == DayOfWeek.SATURDAY) return temporal.plus(6, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.SUNDAY) return temporal.plus(5, ChronoUnit.DAYS);
                return null;
            }
        });
        //2022-01-01T00:00是星期六,他的下一个周五日期是2022-01-07T00:00
        System.out.println(ldt + "是" + ldt.getDayOfWeek().
                getDisplayName(TextStyle.FULL, Locale.CHINESE) +
                                   ",他的下一个周五日期是" + nextFriday);
    }

  或者通过 TemporalAdjusters.ofDateAdjuster

    public static void main(String[] args) {
        LocalDateTime ldt = LocalDateTime.of(2022, 1, 1, 0, 0, 0);
        //可以作为判断条件 -> with 方法中自定义接口,实现同样功能:获取"下个星期五"的日期。
        TemporalAdjuster nextFridayAdjuster = TemporalAdjusters.ofDateAdjuster(new UnaryOperator<LocalDate>() {
            @Override
            public LocalDate apply(LocalDate localDate) {
                //获取当前日期是星期几
                int i = localDate.get(ChronoField.DAY_OF_WEEK);
                DayOfWeek dayOfWeekNow = DayOfWeek.of(i);
                if (dayOfWeekNow == DayOfWeek.MONDAY) return localDate.plus(4, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.TUESDAY) return localDate.plus(3, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.WEDNESDAY) return localDate.plus(2, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.THURSDAY) return localDate.plus(1, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.FRIDAY) return localDate;
                else if (dayOfWeekNow == DayOfWeek.SATURDAY) return localDate.plus(6, ChronoUnit.DAYS);
                else if (dayOfWeekNow == DayOfWeek.SUNDAY) return localDate.plus(5, ChronoUnit.DAYS);
                return null;
            }
        });
        LocalDateTime nextFriday = ldt.with(nextFridayAdjuster);
        //2022-01-01T00:00是星期六,他的下一个周五日期是2022-01-07T00:00
        System.out.println(ldt + "是" + ldt.getDayOfWeek().
                getDisplayName(TextStyle.FULL, Locale.CHINESE) +
                                   ",他的下一个周五日期是" + nextFriday);
    }

  案例2: 已知某公司每个月15号发工资,如果15号是周末,则改为该周的周五发工资。现在要求获取2022年所有发薪日。

/*
2022-01-14 是 星期五
2022-02-15 是 星期二
2022-03-15 是 星期二
2022-04-15 是 星期五
2022-05-13 是 星期五
2022-06-15 是 星期三
2022-07-15 是 星期五
2022-08-15 是 星期一
2022-09-15 是 星期四
2022-10-14 是 星期五
2022-11-15 是 星期二
2022-12-15 是 星期四
*/
    public static void main(String[] args) {
        //获取2022年所有发薪日
        for (int i = 1; i < 13; i++) {
            LocalDate ld = LocalDate.of(2022, i, 1);
            System.out.println(getSalaryDay(ld) + " 是 " + getSalaryDay(ld).getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.CHINESE));
        }
    }

    public static LocalDate getSalaryDay(LocalDate ld) {
        //获取发薪日
        return ld.with(temporal -> {
            //获取日期,并修改为为该月15号
            LocalDate ldSalary = LocalDate.from(temporal).withDayOfMonth(15);
            //如果该月15号是周末,则本周五为发薪日
            DayOfWeek dow = ldSalary.getDayOfWeek();
            boolean isWeekend = dow == DayOfWeek.SUNDAY || dow == DayOfWeek.SATURDAY;
            //如果该月15号周末,则本周五为发薪日
            if (isWeekend) return ldSalary.with(TemporalAdjusters.previous(DayOfWeek.FRIDAY));
            //否则,则15号为发薪日
            return ldSalary;
        });
    }

22/02/11

M

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值