JAVA 获取指定月份的每周的开始日期和结束日期

2023-11-16

1.第一种情况,从1号开始到月份最后一天结束

在这里插入图片描述
代码如下:


	private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
	
	public List<Map> getScope() {
        String date = "2022-06-01";
        String timeStrs[] = date.split("-");
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, Integer.parseInt(timeStrs[0]));
        c.set(Calendar.MONTH, Integer.parseInt(timeStrs[1]) - 1);
        c.setFirstDayOfWeek(Calendar.MONDAY);
        int weeks = c.getActualMaximum(Calendar.WEEK_OF_MONTH);

        LocalDate localDateate = LocalDate.parse(date, dateTimeFormatter);
        //月份第一周的起始时间和结束时间
        LocalDate firstDay = localDateate.with(TemporalAdjusters.firstDayOfMonth());
        String firstDayStr = firstDay.format(dateTimeFormatter);
        String sunStr = getSunOfWeek(firstDayStr);

        List<Map> weekInfos = new ArrayList<>();
        for (int i = 1; i <= weeks; i++) {
            Map weekInfo = new HashMap();
            //第一周的起始时间就是当月的1号,结束时间就是周日
            if (i == 1) {
                weekInfo.put("start",firstDayStr);
                weekInfo.put("end",sunStr);
                weekInfo.put("order",i);
                //计算接下来每周的周一和周日
            } else if (i < weeks) {
                //由于sunStr是上一周的周日,所以取周一要取sunStr的下一周的周一
                String monDay = getLastMonOfWeek(sunStr);
                sunStr = getSunOfWeek(monDay);
                weekInfo.put("start",monDay);
                weekInfo.put("end",sunStr);
                weekInfo.put("order",i);
                //由于最后一周可能结束时间不是周日,所以要单独处理
            } else {
                String monDay = getLastMonOfWeek(sunStr);
                //结束时间肯定就是当前月的最后一天
                LocalDate lastDay = localDateate.with(TemporalAdjusters.lastDayOfMonth());
                String endDay = lastDay.format(dateTimeFormatter);
                weekInfo.put("start",monDay);
                weekInfo.put("end",endDay);
                weekInfo.put("order",i);
            }

            weekInfos.add(weekInfo);

        }
        return weekInfos;
    }


    //算出所在周的周日
    public String getSunOfWeek(String time) {
        LocalDate localDateate = LocalDate.parse(time, dateTimeFormatter);
        LocalDate endday = localDateate.with(TemporalAdjusters.next(java.time.DayOfWeek.MONDAY)).minusDays(1);
        String endDayStr = endday.format(dateTimeFormatter);
        return endDayStr;
    }

    //下一周的周一
    public String getLastMonOfWeek(String time) {
        LocalDate localDateate = LocalDate.parse(time, dateTimeFormatter);
        LocalDate endday = localDateate.with(TemporalAdjusters.next(java.time.DayOfWeek.MONDAY));
        String endDayStr = endday.format(dateTimeFormatter);
        return endDayStr;
    }
    

运行结果:
在这里插入图片描述

2.第二种情况,每周固定从周一开始到周天结束

在这里插入图片描述
代码如下:

	private DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

	public List<Map> getScope() {
        String date = "2022-06-01";
        String timeStrs[] = date.split("-");
        Calendar c = Calendar.getInstance();
        c.set(Calendar.YEAR, Integer.parseInt(timeStrs[0]));
        c.set(Calendar.MONTH, Integer.parseInt(timeStrs[1]) - 1);
        c.setFirstDayOfWeek(Calendar.MONDAY);
        int weeks = c.getActualMaximum(Calendar.WEEK_OF_MONTH);

        LocalDate localDateate = LocalDate.parse(date, dateTimeFormatter);
        //月份第一周的起始时间和结束时间
        LocalDate firstDay = localDateate.with(java.time.DayOfWeek.MONDAY);
        String firstDayStr = firstDay.format(dateTimeFormatter);
        String sunStr = getSunOfWeek(firstDayStr);

        List<Map> weekInfos = new ArrayList<>();
        for (int i = 1; i <= weeks; i++) {
            Map weekInfo = new HashMap();
            //第一周的起始时间就是当月的1号,结束时间就是周日
            if (i == 1) {
                weekInfo.put("start",firstDayStr);
                weekInfo.put("end",sunStr);
                weekInfo.put("order",i);
                //计算接下来每周的周一和周日
            } else {
                //由于sunStr是上一周的周日,所以取周一要取sunStr的下一周的周一
                String monDay = getLastMonOfWeek(sunStr);
                sunStr = getSunOfWeek(monDay);
                weekInfo.put("start",monDay);
                weekInfo.put("end",sunStr);
                weekInfo.put("order",i);
            }
            weekInfos.add(weekInfo);

        }
        return weekInfos;
    }


    //算出所在周的周日
    public String getSunOfWeek(String time) {
        LocalDate localDateate = LocalDate.parse(time, dateTimeFormatter);
        LocalDate endday = localDateate.with(TemporalAdjusters.next(java.time.DayOfWeek.MONDAY)).minusDays(1);
        String endDayStr = endday.format(dateTimeFormatter);
        return endDayStr;
    }

    //下一周的周一
    public String getLastMonOfWeek(String time) {
        LocalDate localDateate = LocalDate.parse(time, dateTimeFormatter);
        LocalDate endday = localDateate.with(TemporalAdjusters.next(java.time.DayOfWeek.MONDAY));
        String endDayStr = endday.format(dateTimeFormatter);
        return endDayStr;
    }

运行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA 获取指定月份的每周的开始日期和结束日期 的相关文章

随机推荐

  • 实时获取微信公众账号粉丝留言,自动返回百度文库下载链接

    实时获取微信公众账号粉丝留言 自动返回百度文库下载链接 思路 用selenium打开微信公众账号登录界面 等待 用微信扫一扫登录管理员后台 继续 开始实时刷新获取微信公众账号粉丝留言 对留言的处理 步骤讲解 用selenium打开 小鹏同学
  • 模板方法(Template Method):类行为型模式

    文章目录 1 设计模式 Design Pattern 1 1 概述 1 2 分类 2 模板方法 Template Method 类行为型模式 2 1 代码示例 2 2 模板方法模式的定义 实现意图 1 设计模式 Design Pattern
  • idea 无法识别vue3语法

    问题描述 整合了vue3 js插件 能够识别到vue标准语法和html语法 第三方库的语法不支持 原因 因为没配置项目根路径 导致无法识别配置文件 而配置文件是识别第三方库语法所必须的 我用vite操作的 需要这么几个包 当识别到这几个配置
  • 命令行下编译带图标的C++程序

    当人们习惯了IDE编程的时候 将会失去一些命令行下编程的快乐和强的 言归正传 首先我们先编写源文件 资源脚本 准备资源 图标 我们准备写一个源文件 Makelove cpp include
  • Qt——多语言程序设计

    一 Qt多语言实现简介 有些软件需要开发多语言界面版本 如中文版和英文版 并且在软件里可以方便地切换界面语言 Qt为多语言界面提供了很好的支持 使用Qt的一些规则和工具 可以很方便地为应用程序开发提供多界面支持 使用Qt 开发多语言界面应用
  • python if else

    study python 2019 02 11 cars audi bmw toyota subaru for car in cars if car bmw print car upper else print car lower car
  • Ubuntu16.04下配置VScode的C/C++开发环境

    VScode环境搭建 1 Vscode安装 2 Vscode环境配置 1 安装c c 插件 2 建立工程 3 更改配置文件 launch json 4 添加构建 编译 链接等 任务 tasks json 5 简单断点调试 3 总结及注意事项
  • 2 拉普拉斯分布

    2 拉普拉斯分布 一元拉普拉斯分布的密度函数为 p x 1 2
  • 2022-2023 计算机视觉顶会截止时间

    2022 2023计算机视觉会议截止时间 参考网页 Docs 网页中内容如下 Level Conference Name Conference Location Submission Deadline Conference Date Web
  • 第三周作业

    1 图文并茂说明raid0 raid1 raid10 raid01 raid5等原理 RAID 0 以chunk为单位并行读写数据 速度非常快 但是没有冗余容错能力 如果一块硬盘损坏的话 会导致所有数据的丢失 最少磁盘数 1 RAID 1
  • vector模板类的简单实现 C++

    学了模板类那一节 所以动手自己用C 简单实现了一下 vector 的几个简单函数 直接上代码吧 include
  • JVM内存溢出与内存泄露

    1 什么是内存溢出 当前创建的对象的大小大于可用的内存容量大小 发生内存溢出 2 什么是内存泄露 该回收的垃圾对象没有被回收 发生了内存泄露 垃圾对象越堆越多 可用内存越来越少 若可用内存无法存放新的垃圾对象 就导致内存溢出 内存泄露会导致
  • 华为云云耀云服务器L实例评测|redis漏洞回顾 & MySQL数据安全解决 搭建主从集群MySQL & 相关设置

    前言 最近华为云云耀云服务器L实例上新 也搞了一台来玩 期间遇到过MySQL数据库被攻击的情况 数据丢失 还好我有几份备份 没有造成太大的损失 后来有发现Redis数据库被攻击的情况 加入了redis密码初步解决问题 总之就是各种遭受毒打
  • 2023年网络与信息安全国际会议(NISecurity 2023)

    会议简介 Brief Introduction 2023年网络与信息安全国际会议 NISecurity 2023 会议时间 2023年10月13日 15日 召开地点 中国 杭州 大会官网 www nisecurity org 2023年网络
  • python之selenium-web自动化<一>

    python之web自动化 二 戳这里 一图了解整个代码驱动浏览器的过程 前提 Chrome浏览器驱动下载地址 http chromedriver storage googleapis com index html Firefox 火狐 浏
  • 【vscode单位转换】px、rem、rpx相互转换工具

    文章目录 一 px rem px rem rem px 我失效了 写个新的 二 px rpx 三 rpx px 重点 四 新 px rem px rem rem px 记录学习的轨迹 2022 06 20 之前写在wiki里 移植记录 具体
  • global lib dirs 在设置多个编译器时仍旧使用旧的编译器路径

    BB的地方 以前自己用arm linux gnueabihf的5 4 1的版本编译测试了虚拟键盘 全部都没有问题 突然呢 说不行 就要用厂家给的arm realarm的5 5版本 原本Qt用5 13 0 那不行 要用13 2的 那拜托你之前
  • springboot项目制作docker镜像,如何动态传递变量值?

    springboot项目制作成docker镜像后 如何给properties文件的变量动态传递值呢 步骤1 将properties文件设置为如下形式 serverUrl SERVER URL apiKey API KEY 步骤2 制作成do
  • 如何重启mysql服务?

    Mysql在修改my ini文件后 如修改字符集 需要重启服务才能生效 下面介绍如何重启mysql服务 1 Win R 输入cmd 确定后进入命令窗口 输入命令net stop mysql 停止当前mysql服务 2 如果出现如图所示错误
  • JAVA 获取指定月份的每周的开始日期和结束日期

    1 第一种情况 从1号开始到月份最后一天结束 代码如下 private DateTimeFormatter dateTimeFormatter DateTimeFormatter ofPattern yyyy MM dd public Li