相关链接
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 | 类名 | 作用 |
---|---|---|
19 | TemporalAdjusters 调节器 | 类中所有方法都会返回一个 TemporalAdjuster 对象。 表示一些 常用时间节点,供时间计算。(常用 g. 日期调节器 with:作为*.with的参数,按照一些特殊规则计算时间) 例如: 上一个星期几(TemporalAdjusters.previous(DayOfWeek dayOfWeek)) 上一个星期几或当天(TemporalAdjusters.previousOrSame(DayOfWeek dayOfWeek)) 下一个星期几(TemporalAdjusters.next(DayOfWeek dayOfWeek)) 下一个星期几或当天(TemporalAdjusters.nextOrSame(DayOfWeek dayOfWeek)) 当月第1个星期几(TemporalAdjusters.firstInMonth(DayOfWeek dayOfWeek)) 当月第n个星期几(TemporalAdjusters.dayOfWeekInMonth(int ordinal, DayOfWeek dayOfWeek)) 当月最后一个星期几(TemporalAdjusters.lastInMonth(DayOfWeek dayOfWeek)) 实例: 获取举例今天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