前端 获取时间范围内的所有周数组集合,第一项为首月的首个周一

devtools/2024/12/22 2:36:13/

具体可实现的效果例如:

数据格式:

具体代码实现:

javascript">     /*** 获取当前日期的第一个周一是哪天* @params date - 'YYYY-MM'*/function getMonthFirstWeekDay(date) {let year = new Date(date).getFullYear();let month = new Date(date).getMonth();for (let week = 1; week < 8; week++) {if (new Date(`${year}-${month + 1}-${week}`).getDay() === 1) {return week;}}}/*** 获取start日期到end日期的周集合* @params start - 'YYYY-MM'* @params end - 'YYYY-MM'*/function getAllWeeks(start, end) {if (!start) return [];// 结束日期try {let endDate = end ? new Date(end) : new Date();let endYear = endDate.getFullYear();let endMonth = endDate.getMonth() + 2;if (endMonth > 11) {endMonth = "1";endYear++;}end = `${endYear}-${endMonth}`;const weeks = []; // 周数组let firstWeek = getMonthFirstWeekDay(start); // 周几let firstDate = `${start}-${firstWeek}`; // 第一周日期let endTimestamp = new Date(end).getTime(); // 不超过最后月份时间戳let prevTimestamp = new Date(firstDate).getTime(); // 第一周时间戳let oneDay = 24 * 60 * 60 * 1000; // 一天的时间戳偏移量while (prevTimestamp < endTimestamp) {let prevDate = new Date(prevTimestamp);let nextDate = new Date(prevTimestamp + oneDay * 6);let prevY = prevDate.getFullYear();let prevM = prevDate.getMonth() + 1;let prevD = prevDate.getDate();let nextY = nextDate.getFullYear();let nextM = nextDate.getMonth() + 1;let nextD = nextDate.getDate();weeks.push([{year: prevY,month: prevM,day: prevD,ymd: `${prevY}-${prevM}-${prevD}`,ym: `${prevY}-${prevM}`,md: `${prevM}-${prevD}`,},{year: nextY,month: nextM,day: nextD,ymd: `${nextY}-${nextM}-${nextD}`,ym: `${nextY}-${nextM}`,md: `${nextM}-${nextD}`,},]);prevTimestamp += oneDay * 7;}return weeks;} catch (error) {return [];}}// 使用示例// 全部周const weeks = getAllWeeks("2023-12", "2024-01");console.log("weeks:", weeks);// 按月分组const weeksByMonth = Object.groupBy(weeks, (op) => op[0].ym);console.log("weeksByMonth:", weeksByMonth);// 按年分组const weeksByYear = Object.groupBy(weeks, (op) => op[0].year);console.log("weeksByYear:", weeksByYear);

需求简要描述一下吧

就是获取某个时间范围内,生成月报周报,第一个周报为时间范围当月的第一周,跨周则依然归属于当月,跨周的下个周一才归属下个月。生成这样的周报月报下拉选项。


http://www.ppmy.cn/devtools/97891.html

相关文章

Android 开发中常用的布局类型及其选择指南

在 Android 开发过程中,选择正确的布局类型对于构建高效、美观且响应式的用户界面至关重要。本文将介绍 Android 中几种最常用的布局类型,并对比它们的特点和适用场景,帮助开发者们做出明智的选择。 1. LinearLayout - 线性布局 特点: LinearLayout 是最基本的布局类型之一…

Linux网络编程2(理解局域网)

前面的一篇文章&#xff0c;我们简单地了解了网络的发展过程&#xff0c;并且简单的介绍了网络的一些基本术语&#xff0c;这篇文章&#xff0c;我们来详细的了解一下局域网的内容&#xff0c;相信看完这篇文章&#xff0c;大家能够对局域网有清晰的认识。 教科书一般是按照五层…

深入理解逻辑回归

深入理解逻辑回归 文章目录 深入理解逻辑回归什么是逻辑回归&#xff1f;Sigmoid 函数几率&#xff08;Odds&#xff09;与对数几率&#xff08;Logit&#xff09;函数为什么使用对数几率函数&#xff1f;总结 逻辑回归&#xff08;Logistic Regression&#xff09;是机器学习和…

驾驭数据之序:SQL序列的奥秘与实现

标题&#xff1a;驾驭数据之序&#xff1a;SQL序列的奥秘与实现 摘要 在数据库管理中&#xff0c;保证数据的有序性和唯一性是至关重要的。SQL序列&#xff08;Sequence&#xff09;作为一种强大的数据库对象&#xff0c;为我们提供了一种在不同数据库系统中生成连续数字的手…

JMeter处理接口签名sign

写接口脚本的时候&#xff0c;很多接口涉及到签名&#xff0c;今天介绍下用JMeter编写签名脚本的方法。 举个例子&#xff0c;开启红包接口&#xff0c;请求方式为post POST /v1/api/red/open json请求参数 { "red_id":1, "timestamp":"16670338…

微服务:分布式事务

&#x1f4a5; 该系列属于【SpringBoot基础】专栏&#xff0c;如您需查看其他SpringBoot相关文章&#xff0c;请您点击左边的连接 目录 一、引言 二、Seata 三、部署TC服务 1. 准备数据库表 2. 准备配置文件 3. Docker部署 四、微服务集成Seata 1. 引入依赖 2. 改造配…

【企业高性能web服务器】

目录 一、Nginx 介绍1、 Nginx 功能介绍2、基础特性3、Nginx 模块介绍 二、Nginx 编译安装1、编写systemd服务 三、平滑升级和回滚1、平滑升级的流程2、升级2、回滚 四、 Nginx 核心配置详解1、实现 nginx 的高并发配置2、Nginx 账户认证功能3、nginx作为下载服务器配置 五、re…

【K8s】专题十二(1):Kubernetes 存储简介

本文内容均来自个人笔记并重新梳理&#xff0c;如有错误欢迎指正&#xff01; 如果对您有帮助&#xff0c;烦请点赞、关注、转发、订阅专栏&#xff01; 专栏订阅入口 Linux 专栏 | Docker 专栏 | Kubernetes 专栏 往期精彩文章 【Docker】&#xff08;全网首发&#xff09;Kyl…