外国的文化习惯和外国的代码设计其实还是有很大差别的,毕竟代码是全球的人都要用的,是不能强行说偏袒某一方的(不像现在的漂亮国,扯远了),只能说代码里唯一借鉴了外国的只是用字母而已,其实代码设计是一个逻辑思考过程,题主太焦急了一点,不妨,我们慢慢来看

首先是TemporalAdjusters.previous方法,在该方法的注释中已经提到了,该方法采用的时间字段是ChronoField.DAY_OF_WEEK,也就是按照一周7天来算,也就是满打满算的一周七天,并且返回上一次出现的你传入的DayOfWeek

注意这里说的是上一次的,而不是上一周的

有区别么?当然有,举个例子,还是用你的LocaDate.of(2020,10,21),虽然TemporalAdjusters.previous(DayOfWeek.SUNDAY)

最终返回的是2020-10-18,那如果填入的是DayOfWeek.MONDAY,也就是上一个周一,会是多少呢?难道会是2020-10-12日么?也就是上一周周一。不是的,答案其实是2020-10-19,也就是上一个周一,不是上一周的周一

所以首先在方法选型上,可能就不太对口,更不用谈是不是周一开始一周还是周日开始一周了,用这个方法是完成不了根据一个时间取到上一周的某个星期的问题

(如果不想看下面的思路,可能写的有点绕,容易混乱,可以直接拖到最下面查看最终代码)

当然也不是说TemporalAdjusters.previous方法完全没用,起码在注释中已经说到,这样的处理适用于很多日历系统,算是比较通用的方法吧

不说TemporalAdjusters.previous了,咱们来看看题主要解决的问题如何操作。

我觉得关键就是在于上一个和上一周的区别上一个:只是说往前遍历,找到第一次出现

上一周:应该首先给予一个周定义,它应该定义在更大范围内,比如月份里的第几周,这个周定义是相对于DayOfWeek的,比DayOfWeek更大范围,在更大范围的定位里,找到上一周,然后再回到上一周中,根据DayOfWeek定义里需要修改的数值进行修改。当然你也可以先修改DayOfWeek定义里需要的数值,然后再找到上一周。顺序肯定是可以颠倒的

所以说从理解上来说是有2步要做的。如果是对Java8时间API设计比较了解的话,应该知道,在API设计中描述飘渺的时间,主要就是靠定义,也就是时间字段的定义,一个时间,用不同的时间字段去描述,是可以获取到不同的值,这也就是时间字段+数值=时间

在时间顶层接口TemporalAccessor的get方法就可以见一斑

那时间字段TemporalField由于它是定义,所以时间定义上肯定会有单位,也就是TemporalUnit,以及范围,比如一个分钟有60秒,一周有7天,一年有365天等等,这都是基于某个单位下的数值范围。

所以我们现在需要的就是构造一个周定义,单位肯定是天,范围也是7天,但是最小一周也有1天,不像之前提到的的ChronoField.DAY_OF_WEEK,它的最小一周也有7天,因为是满打满算嘛

那这个定义我在另一个回答里有提到就是参考WeekFields的静态变量SUNDAY_START

WeekFields可以简单理解为构建自定义一周的工具类,里面有个静态变量SUNDAY_START就是以周日为起点,最小一周只有1天的WeekFields定义了

此时还不是周定义,因为周定义需要在月份中,而恰好WeekFields提供了方法weekOfMonthTemporalField weekOfMonthTemporalField = WeekFields.SUNDAY_START.weekOfMonth();

weekOfMonthTemporalField才是我们要找的,以周日为一周起点的更大范围下的周定义

有了它,我们就可以构造一个TemporalAdjuster了,用于把参数日期按照weekOfMonthTemporalField的定义调整到上一周TemporalAdjuster temporalAdjuster = temporal -> temporal.minus(1, weekOfMonthTemporalField.getBaseUnit());

我们这里采用了Temporal的minus方法,减去一个1个weekOfMonthTemporalField定义下的单位,因为之前我们提到了TemporalField本来就是由TemporalUnit组成的,所以这样操作是合理的

当然由于这里是时间单位,不是时间字段,所以不论是周一开始的周,还是周日开始的周,它们的单位都是周,而周在Java8的API中是有枚举的,也就是ChronoUnit其中的WEEKS,所以我们也可以这么写TemporalAdjuster temporalAdjuster = temporal -> temporal.minus(1, ChronoUnit.WEEKS);

其实就是日期减了一周,然后减了一周之后,我们在按照要求把时间调整(with方法,带TemporalField参数的)到传入的DayOfWeek即可,调整需要涉及时间字段,那我们就从刚才的周日开始的WeekFields定义取出DayOfWeek的定义,也就是TemporalField dayOfWeekTemporalField = WeekFields.SUNDAY_START.dayOfWeek()

那这样,我们的TemporalAdjuster就变为TemporalAdjuster temporalAdjuster = temporal -> temporal.minus(1, ChronoUnit.WEEKS)

.with(dayOfWeekTemporalField, 1);

为啥填入的是1,因为dayOfWeekTemporalField是时间字段,是定义,在这个定义下,周日是第一天,所以这个with方法含义就是按照dayOfWeekTemporalField的定义修改该字段值为1

整合一下完整的代码:LocalDate date = LocalDate.of(2020,10,21);

TemporalField dayOfWeekTemporalField = WeekFields.SUNDAY_START.dayOfWeek();

TemporalAdjuster temporalAdjuster = temporal -> temporal.minus(1, WEEKS)

.with(dayOfWeekTemporalField, 1);

LocalDate newLocalDate = date.with(temporalAdjuster);

System.out.println(newLocalDate);

你也可以自己模仿TemporalAdjusters创建一个属于自己的TemporalAdjuster工厂CustomTemporalAdjusterspublic class CustomTemporalAdjusters {

public static TemporalAdjuster sundayOfPreviousWeek() {

return temporal -> temporal.minus(1, WEEKS)

.with(WeekFields.SUNDAY_START.dayOfWeek(), 1);

}

}

然后调用起来就比较方便了LocalDate date = LocalDate.of(2020,10,21);

LocalDate newLocalDate = date.with(CustomTemporalAdjusters.sundayOfPreviousWeek());

System.out.println(newLocalDate);

但是这样做CustomTemporalAdjusters中的处理还是有点局限性,万一想看上一周的周三,周四呢?现在只能处理周日,所以我们再稍微改一下就可以了,主要修改最后的调整方法,也就是with(WeekFields.SUNDAY_START.dayOfWeek(), 1);,这里为什么是1,是因为在WeekFields.SUNDAY_START.dayOfWeek()的定义下是1,也就是DayOfWeek.SUNDAY在WeekFields.SUNDAY_START.dayOfWeek()定义为1,所以我们只要把需要查看的DayOfWeek放到WeekFields.SUNDAY_START.dayOfWeek()的定义里获取值即可,这个值就是需要修改的。也就是用到我们TemporalAccessor的get方法

最终代码应该是这样的public class CustomTemporalAdjusters {

public static TemporalAdjuster sundayOfPreviousWeek() {

return dayOfPreviousWeek(DayOfWeek.SUNDAY);

}

public static TemporalAdjuster dayOfPreviousWeek(DayOfWeek dayOfWeek) {

TemporalField temporalField = WeekFields.SUNDAY_START.dayOfWeek();

return temporal -> temporal.minus(1, WEEKS)

.with(temporalField, dayOfWeek.get(temporalField));

}

}

调用的时候,两种方法都可以LocalDate date = LocalDate.of(2020,10,21);

date.with(CustomTemporalAdjusters.dayOfPreviousWeek(DayOfWeek.SUNDAY));

date.with(CustomTemporalAdjusters.sundayOfPreviousWeek());

以上就是我的思路和答案,希望能对你有所帮助,拜了个拜(′▽`〃)

java初期localdate_Java的localdate如何调整一周起始日为周日相关推荐

  1. Java日期时间(LocalDate、LocalTime、LocalDateTime)

    文章目录 Java日期时间(LocalDate.LocalTime.LocalDateTime) 前言 1.LocalDate 1.1.LocalDate常用API 1.2.LocalDate 与 S ...

  2. Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几

    Java 获取当前时间之后的第一个周几,java获取当前日期的下一个周几 //获得入参的日期 Calendar cd = Calendar.getInstance(); cd.setTime(date ...

  3. java表格计算,JAVA表格两日期间月,周,日计算

    JAVA报表两日期间月,周,日计算 //计算天数 public List day(String dates, String datee) throws ParseException { List da ...

  4. Java:DateUtils 获取 本上下(周/月)周一周日 最后一天 当月多少天

    前言 使用日期函数,获取当月多少天,当前第几月,以及各种与时间有关系的操作: 这篇文章草稿是在19-5-30写好的,一直想完善,写个一网打尽的,奈何自己懒,一直没写完,时隔一年,写完吧,基本上可以处理 ...

  5. java获取当前时间所在一周的周一和周日日期

    package javatest;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date ...

  6. java初期localdate,LocalDate形式

    我有一个关于Spring Thymeleaf日期格式的问题 . 我有一个带有 LocalDate date 字段的简单实体 . 我希望从表单中的用户获取此日期并将其保存到MySQL数据库 . 我收到这 ...

  7. java localdate_Java日期LocalDate使用

    在做报表统计时,需要对指定时间内的数据做统计,则需要使用到时间日期API 在此使用的是java.util.Date的完美私生子LocalDate类 LocalDate方法介绍 now() : 从默认时 ...

  8. Java中日期处理--LocalDate类

    文章目录 0 写在前面 1 介绍 2 举例 3 写在后面 0 写在前面 Java中存在一个日历表示法的类库–>LocalDate类. 如果只想要指定的年月日就可以用这个LocalDate类. 1 ...

  9. java 男女 相邻交换 队形_调整队形+上机编程调整男孩女孩顺序

    上机编程调整男孩女孩顺序 1.题目:在幼儿园有n个小朋友排列为一个队伍,从左到右一个挨着一个编号为(0~n-1).其中有一些是男生,有一些是女生,男生用'B'表示,女生用'G'表示.小朋友们都很顽皮, ...

最新文章

  1. Ubuntu18.04安装cudnn
  2. 抢票软件原理_手机部应届生软件大赛 | SHOW MI YOUR CODE
  3. 成功解决TypeError int object is not iterable
  4. Winform中在使用Dock属性设计页面布局控件的顺序导致页面效果不同的问题
  5. ubuntu下面codelite运行代码一闪而过的问题、codelite的代码排版快捷键、去掉xfce4的Ctrl+F5
  6. ssh远程工具_良心国产工具,比Xshell好用还免费!
  7. Minimizing Difference CodeForces - 1244E(贪心题)
  8. 如何:通过现有代码创建 C++ 项目
  9. 前端类名优秀命名例子_这是一篇需要花费你15分钟阅读的干货!浅谈前端工程化...
  10. php pdo 错误信息,PHP的PDO错误与错误处理
  11. 字符串%百分号 和 format 格式化
  12. 前后端交互之封装Ajax+SpringMVC源码分析
  13. 【iOS开发】Alamofire框架的使用二 高级用法
  14. mysql复制(高可用架构方案的基础)
  15. fckeditor for php 下载,fck_FCKeditor免费最新版下载[HTML编辑]-下载之家
  16. SPSS Modeler 聚类分析(第十六章)
  17. 构建Spring Web应用程序
  18. 利用c语言switch函数制作一个简单的计算器 2021年2月7日
  19. Security Best Practices+Klocwork
  20. 金蟾论金:4.13黄金探底回升收复跌势、晚间黄金走势分析指导

热门文章

  1. ICLR 2022杰出论文奖出炉!清华、人大获奖!浙大提名
  2. 安装MySql5-7
  3. PCB板框的绘制——AD19
  4. require与import的区别和使用
  5. java软件工程师简历内容
  6. 网络流量监测与调度技术研究
  7. 百度技术沙龙第33期回顾:推荐引擎实战(含资料下载)
  8. JN5169 系统控制器 API 函数表
  9. 培训计算机心得体会800字,职业技能培训心得体会800字(精选5篇)
  10. 中华上下五千年演变图