月份中的星期java_java中有比较好的方式去获取某个月中星期几所对应的日期吗?...

加7天的方式来说,是比较耿直的,但是这也是很顺畅并且正确的思路嘛,就算有java8封装好的一些api,它本质的实现逻辑肯定也还是逃不过这个天数的加减嘛,毕竟加减总比挨着挨着比要好点噻

话说回来,那我开始看到这里,我首先就想到了笨办法,挨着挨着比嘛。

(注:不过在列出我的代码前,我想额外提一点,我建议呢,这个方法的入参最好还是要加个年吧,毕竟2019的12月里的周六,和2020年的12月的周六,那肯定是不一样的。所以我下面给出的方法,入参都是年+月)

那思路就很简单啦,我们直接根据输入的年和月构造出咱们的YearMonth(这个可是java8新增的年月的时间类,整挺好)

根据YearMonth的lengthOfMonth()可以快速得到这个月多少天

依据这个月多少天,利用IntStream.rangeClosed()方法构造一个这个月所有天的数字流IntStream,再用mapToObject()方法转换成Stream

Stream挨着挨着判断是否等于周六,最后collector(Collectors.toList())完成public static List querySaturday(int year, Month month) {

YearMonth yearMonth = YearMonth.of(year, month);

return IntStream.rangeClosed(1, yearMonth.lengthOfMonth())

.mapToObj(day -> LocalDate.of(year, month, day))

.filter(day -> day.getDayOfWeek() == DayOfWeek.SATURDAY)

.collect(Collectors.toList());

}

总之也还算比较简单,不过就是有点费空间,毕竟中间有很多不要的LocalDate被new出来了

那回到题主最早想的加减法方式,当然我们肯定不会自己去加减,不过思路其实和上面一样,肯定也是要构建一个流的,不过加减法的说法那是我们程序员最底层的思维方式,但是放在理解java8的很多api设计上,咱们需要的是声明式的思维,告诉api你想要什么,而不是告诉它怎么去实现,这样起码来说找方法你会想到一些关键词,也就是说其实我最开始也是不知道具体到底有没有api,一旦你多了解了一些java8的api设计,不说怎么设计,起码它这个起名你就摸到点门道~

那关键词是什么么?是next,下一个,虽然最开始我不知道到底有没有api,但是我的思路是:

构造一个流,这个流的创建是基于下一个周六,这样的模式创建的流里都是周六,然后依据个数简单截断,再依据月份进行过滤,最终得到答案

那为啥我会想到是next呢?在调整时间上api是咱们的TemporalAdjuster接口掌管,一个TemporalAdjuster接口实现就是一种调整时间的方式,它很多的实现类都在已经为你写好的工具类TemporalAdjusters中,对,多了个s,这里面的静态构造方法名,你打开一看就明白了

aab70e1db2cdc63dcdce27f48528fe13.png

尽都是些很直抒胸臆的方法命名,一看你就知道它在做啥。什么first,last,previous,那我也就立马发现这个方法,恰好就叫next,传参就是DayOfWeek,

cb3c2add6dd8fa2e7f8aa33a23d11dc6.png

DayOfWeek是啥?就是周一到周六的枚举啊,官方的

92faf94e85b9219bd5d4d72eb175bf82.png

安排的明明白白,那就简单了,我们找到了如何获取下一个周六的方法,那我们只需要首先获取这个年月的第一个周六,然后依照TemporalAdjusters.next方法就可以构造出所有都是周六的流了

那我们怎么获取这个年月的第一个周六呢?还记得刚才说的么?那就找找first开头的方法呗,巧了,还真有一个firstInMonth,传参也是DayOfWeek,这不就简单了么,所以我们可以直接完整代码了public static List querySaturday(int year, Month month) {

YearMonth yearMonth = YearMonth.of(year, month);

LocalDate firstSaturday = LocalDate.now().with(yearMonth).with(TemporalAdjusters.firstInMonth(DayOfWeek.SATURDAY));

return Stream.iterate(firstSaturday, localDate -> localDate.with(TemporalAdjusters.next(DayOfWeek.SATURDAY)))

.limit(4)

.filter(localDate -> localDate.getMonth() == month)

.collect(Collectors.toList());

}

差不多就是这样叭,拜了个拜~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值