js 取得上个月第一天和最后一天

获取上个月日期范围
本文介绍了一段JavaScript代码,用于获取当前月份上一个月的第一天和最后一天的具体日期,包括年月日。通过调整Date对象的月份属性并进行边界判断,确保了日期的准确性。

  var nowdays = new Date();

  var year = nowdays.getFullYear();

    var month = nowdays.getMonth();

    if(month==0)

    {

        month=12;

        year=year-1;

    }

    if (month < 10) {

        month = "0" + month;

    }

    var firstDay = year + "-" + month + "-" + "01";//上个月的第一天

    var myDate = new Date(year, month, 0);

    var lastDay = year + "-" + month + "-" + myDate.getDate();//上个月的最后一天

}

转载于:https://www.cnblogs.com/loveTechnology/p/7209579.html

跟网型逆变器小干扰稳定性分析与控制策略优化研究(Simulink仿真实现)内容概要:本文围绕跟网型逆变器的小干扰稳定性展开分析,重点研究其在电力系统中的动态响应特性及控制策略优化问题。通过构建基于Simulink的仿真模型,对逆变器在不同工况下的小信号稳定性进行建模与分析,识别系统可能存在的振荡风险,并提出相应的控制优化方法以提升系统稳定性动态性能。研究内容涵盖数学建模、稳定性判据分析、控制器设计与参数优化,并结合仿真验证所提策略的有效性,为新能源并网系统的稳定运行提供理论支持技术参考。; 适合人群:具备电力电子、自动控制或电力系统相关背景,熟悉Matlab/Simulink仿真工具,从事新能源并网、微电网或电力系统稳定性研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 分析跟网型逆变器在弱电网条件下的小干扰稳定性问题;② 设计并优化逆变器外环与内环控制器以提升系统阻尼特性;③ 利用Simulink搭建仿真模型验证理论分析与控制策略的有效性;④ 支持科研论文撰写、课题研究或工程项目中的稳定性评估与改进。; 阅读建议:建议读者结合文中提供的Simulink仿真模型,深入理解状态空间建模、特征值分析及控制器设计过程,重点关注控制参数变化对系统极点分布的影响,并通过动手仿真加深对小干扰稳定性机理的认识。
<think>由于前端通常使用JavaScript,我们可以使用Date对象来处理日期计算。 目标:给定一个字符串形式的账单月份(例如"202403"表示2024年3月),计算上一个月的第一天最后一天。 步骤: 1. 解析账单月份,得到年份月份。 2. 计算上一个月的年份月份(注意跨年情况:如果当前是1月,则上个月是上一年的12月)。 3. 计算上个月第一天(即1号)最后一天(需要知道上个月有多少天)。 计算最后一天的方法:将当前月的第一天减去一天,得到的就是上个月最后一天。 具体实现: - 将账单月份转换为年份月份数字。 - 创建一个日期对象,表示当前账单月份的第一天(注意:JavaScript的月份从0开始,0代表1月)。 - 然后,将当前月份的第一天减去一天,得到上个月最后一天。 - 上个月第一天就是上个月最后一天所在月份的第一天(即日期设为1)。 注意:时间部分,我们通常需要第一天的00:00:00最后一天的23:59:59.999(或23:59:59)。 但是,根据需求,我们可能只需要日期部分,或者需要完整的日期时间对象。这里我们按照完整的时间对象来返回。 代码实现:</think>### 前端解决方案:计算上个月第一天最后一天 以下是使用 JavaScript 实现的计算上个月第一天(00:00:00)最后一天(23:59:59.999)的完整解决方案: ```javascript /** * 根据账单月份计算上个月第一天最后一天 * @param {string} billMonth - 账单月份 (格式: YYYYMM 如 "202403") * @returns {Object} 包含 startDate endDate 的对象 */ function getPreviousMonthRange(billMonth) { // 验证输入格式 if (!/^\d{6}$/.test(billMonth)) { throw new Error('账单月份格式错误,应为6位数字 (如 "202403")'); } const year = parseInt(billMonth.substring(0, 4)); const month = parseInt(billMonth.substring(4, 6)); // 验证月份有效性 if (month < 1 || month > 12) { throw new Error('月份必须在01-12之间'); } // 计算当前月的第一天 const currentMonthFirstDay = new Date(year, month - 1, 1); // 计算上个月最后一天 (当前月第一天减1毫秒) const lastDayPrevMonth = new Date(currentMonthFirstDay.getTime() - 1); // 计算上个月第一天 const firstDayPrevMonth = new Date( lastDayPrevMonth.getFullYear(), lastDayPrevMonth.getMonth(), 1 ); // 设置时间部分 const startDate = new Date(firstDayPrevMonth); const endDate = new Date(lastDayPrevMonth); endDate.setHours(23, 59, 59, 999); // 设置为当天的最后一毫秒 return { startDate, // 上个月第一天 00:00:00.000 endDate // 上个月最后一天 23:59:59.999 }; } // 示例使用 const billMonth = "202403"; // 2024年3月 const { startDate, endDate } = getPreviousMonthRange(billMonth); console.log("账单月份:", billMonth); console.log("上个月第一天:", startDate.toLocaleString()); console.log("上个月最后一天:", endDate.toLocaleString()); console.log("ISO格式:", startDate.toISOString(), "到", endDate.toISOString()); ``` ### 代码解释 #### 1. 输入验证 ```javascript if (!/^\d{6}$/.test(billMonth)) { throw new Error('账单月份格式错误,应为6位数字 (如 "202403")'); } ``` - 使用正则表达式验证输入是否为6位数字 - 不符合格式时抛出明确错误 #### 2. 日期计算核心逻辑 ```javascript // 计算当前月的第一天 const currentMonthFirstDay = new Date(year, month - 1, 1); // 计算上个月最后一天 (当前月第一天减1毫秒) const lastDayPrevMonth = new Date(currentMonthFirstDay.getTime() - 1); ``` - `month - 1`:JavaScript中月份从0开始(0=1月,11=12月) - 减1毫秒得到上个月最后一天的23:59:59.999 #### 3. 获取上个月第一天 ```javascript const firstDayPrevMonth = new Date( lastDayPrevMonth.getFullYear(), lastDayPrevMonth.getMonth(), 1 ); ``` - 使用上个月最后一天的年月信息创建当月第一天 #### 4. 时间部分设置 ```javascript endDate.setHours(23, 59, 59, 999); ``` - 精确设置结束时间为当天的最后一毫秒 - 避免因时间精度问题导致的范围错误 #### 5. 返回值 ```javascript return { startDate, // 上个月第一天 00:00:00.000 endDate // 上个月最后一天 23:59:59.999 }; ``` - 返回包含两个Date对象的对象 - 保持原始Date对象以便灵活使用 ### 关键特性 1. **自动处理跨年** 当输入月份为1月(如"202401")时,自动计算为前一年的12月 2. **闰年自动适应** 正确处理2024年2月有29天的情况 3. **时区安全** 使用本地时间计算,避免UTC转换问题 4. **精确时间范围** 开始时间精确到00:00:00.000 结束时间精确到23:59:59.999 5. **完整验证** 检查输入格式月份有效性 ### 使用示例 ```javascript // 测试不同月份 testMonth("202401"); // 1月 (跨年) testMonth("202402"); // 闰年2月 testMonth("202312"); // 12月 function testMonth(month) { try { const { startDate, endDate } = getPreviousMonthRange(month); console.log(`账单月份: ${month}`); console.log(`上个月: ${startDate.toLocaleDateString()} 到 ${endDate.toLocaleDateString()}`); console.log(`天数: ${Math.round((endDate - startDate)/(1000*60*60*24))}天`); } catch (e) { console.error(e.message); } } ``` ### 输出示例 ``` 账单月份: 202403 上个月第一天: 2024/2/1 00:00:00 上个月最后一天: 2024/2/29 23:59:59 ISO格式: 2024-01-31T16:00:00.000Z 到 2024-02-29T15:59:59.999Z ``` ### 注意事项 1. **时区处理** 代码使用浏览器的本地时区,如需UTC时间可改用`Date.UTC()` 2. **日期格式化** 使用`toLocaleString()`或`toLocaleDateString()`根据用户区域设置格式化日期 3. **旧浏览器兼容** 如需支持IE等旧浏览器,可添加Date polyfill 4. **时间精度** 结束时间设置为23:59:59.999确保包含整天的最后一毫秒 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值