java - 如何获得下一个星期五,即一个月的第一个、第二个或第三个星期五?
问题描述
我需要找到接下来的 n 个星期五,但想排除第 4 个和可能的第 5 个星期五,即我想得到接下来的 n 个星期五,它们是每个月的第 1 个、第 2 个或第 3 个星期五。我找到了一种在接下来的 n 个星期五(例如接下来的 10 个星期五)进行流式传输的方法:
LocalDate now = LocalDate.now();
Stream.iterate(now , localDate -> localDate.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)))
.skip(1) // skip today
.limit(10)
.forEach(System.out::println);
输出:
2021-10-22
2021-10-29
2021-11-05
2021-11-12
2021-11-19
2021-11-26
2021-12-03
2021-12-10
2021-12-17
2021-12-24
但我需要排除例如2021-10-22
&2021-10-29
因为它们是 10 月的第 4 和第 5 个星期五。同样2021-11-26
&2021-12-24
因为它们不是第一个、第二个或第三个星期五。
我搜索了 SO 并找到了一些方法来计算一个月的第 n 个星期五,例如这个
public static LocalDate nthFridayOfMonth(LocalDate localDate, int week) {
return localDate.with(TemporalAdjusters.dayOfWeekInMonth(week, DayOfWeek.FRIDAY));
}
返回给定日期的第 n 个星期五。
如果给定的 LocalDate 是一个月的第一个、第二个或第三个星期五,如何修改此方法以使其返回布尔值?或者使用这个方法来实现另一个我需要的方法?
理想情况下,我想使用上面的流并使用一种方法,该方法返回一个布尔值作为过滤器:
LocalDate now = LocalDate.now();
Stream.iterate(now , localDate -> localDate.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)))
.skip(1) // skip today
.filter(d -> is1st2ndOr3rdFriday(d))
.limit(10)
.forEach(System.out::println);
要得到
2021-11-05
2021-11-12
2021-11-19
2021-12-03
2021-12-10
2021-12-17
2022-01-07
2022-01-14
2022-01-21
2022-02-04
感谢有关如何实现过滤器方法的任何帮助boolean is1st2ndOr3rdFriday(LocalDate d) {}
解决方案
可以获取ALIGNED_WEEK_OF_MONTH
本地日期的时域,判断是否≤3。
Stream.iterate(now , localDate -> localDate.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)))
.skip(1) // skip today
.filter(x -> x.get(ChronoField.ALIGNED_WEEK_OF_MONTH) <= 3)
.limit(10)
.forEach(System.out::println);
推荐阅读
- here-api - 使用 Here Maps 检查路线中的收费公路
- r - 在 ubuntu 16.04 上安装 rgdal
- php - jQuery Validate 在 PHP 中无法正常工作
- python - 如何切片 MultiIndex 和列?
- c# - C# WFP 不确定进度条动画
- javascript - 如何使用输入组件数组中的输入值创建一个数组?
- java - 将火花行对象转换为 java pojo
- python - 如何在 Python 3 中划分列表列表?
- mule - vars 在 Mule 4 中的 http 请求者的主体中没有被评估
- php - AMPPS:Apache 使用端口 8080,可以访问 Wordpress 管理员,但无法加载主页