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

首先是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. 漏答题、偏科、多次复读,30 位互联网大佬考上啥大学了?
  2. mysql集群的配置
  3. linux下ELK搭建好之后配置sentinl插件,进行邮件告警
  4. python装饰器函数-python函数装饰器
  5. setTimeout延时0毫秒的作用
  6. Define change document object
  7. Redis系列一、redis介绍与安装
  8. 数据是如何被保护的?高质量存储告诉你
  9. 【开发者成长】Vue.js 中有哪些性能陷阱
  10. I/O重定向的原理和实现
  11. java内存分配 图_java运行内存分配图(转)
  12. windows10桌面_32位windows10系统正式版推荐下载
  13. C语言运算优先级记忆口诀
  14. Endnote X6大客户版破解版+新功能介绍+视频介绍
  15. Matlab读取处理Excel数据并拟合正态分布曲线
  16. elementUi中的el-select/el-input去掉border边框
  17. 华师计算机学院新上任书记,华师大4位校领导履新 任友群任常务副书记
  18. SSM中监听器调用service层空指针异常
  19. JS对图片进行黑白化
  20. Python字典遍历

热门文章

  1. canvas实现动画 地球绕太阳公转 月球绕地球公转
  2. 9.7. Pattern Matching
  3. 微信自动加人软件安装使用
  4. JDK版本不兼容问题
  5. ECCV2022 | 基于整合IMU运动动力学的无监督单目深度估计
  6. PhotoShop: 对一张图片进行 不同尺寸 批量裁剪
  7. 计算机编程国际赛事,中小学生学习C++编程可以参加的赛事
  8. 会员招募html5,会员招募活动策划方案
  9. latex中的求和符号,连乘符号等
  10. my97显示服务器时间,封装Web Uploader 上传插件、My97DatePicker、百度 编辑器 的使用 (ASP.NET MVC)...