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

**项目名称:** 基于Vue.js与Spring Cloud架构的博客系统设计与开发——微服务分布式应用实践 **项目概述:** 本项目为计算机科学与技术专业本科毕业设计成果,旨在设计并实现一个采用前后端分离架构的现代化博客平台。系统前端基于Vue.js框架构建,提供响应式用户界面;后端采用Spring Cloud微服务架构,通过服务拆分、注册发现、配置中心及网关路由等技术,构建高可用、易扩展的分布式应用体系。项目重点探讨微服务模式下的系统设计、服务治理、数据一致性及部署运维等关键问题,体现了分布式系统在Web应用中的实践价值。 **技术架构:** 1. **前端技术栈:** Vue.js 2.x、Vue Router、Vuex、Element UI、Axios 2. **后端技术栈:** Spring Boot 2.x、Spring Cloud (Eureka/Nacos、Feign/OpenFeign、Ribbon、Hystrix、Zuul/Gateway、Config) 3. **数据存储:** MySQL 8.0(主数据存储)、Redis(缓存与会话管理) 4. **服务通信:** RESTful API、消息队列(可选RabbitMQ/Kafka) 5. **部署与运维:** Docker容器化、Jenkins持续集成、Nginx负载均衡 **核心功能模块:** - 用户管理:注册登录、权限控制、个人中心 - 文章管理:富文本编辑、分类标签、发布审核、评论互动 - 内容展示:首页推荐、分类检索、全文搜索、热门排行 - 系统管理:后台仪表盘、用户与内容监控、日志审计 - 微服务治理:服务健康检测、动态配置更新、熔断降级策略 **设计特点:** 1. **架构解耦:** 前后端完全分离,通过API网关统一接入,支持独立开发与部署。 2. **服务拆分:** 按业务域划分为用户服务、文章服务、评论服务、文件服务等独立微服务。 3. **高可用设计:** 采用服务注册发现机制,配合负载均衡与熔断器,提升系统容错能力。 4. **可扩展性:** 模块化设计支持横向扩展,配置中心实现运行时动态调整。 **项目成果:** 完成了一个具备完整博客功能、具备微服务典型特征的分布式系统原型,通过容器化部署验证了多服务协同运行的可行性,为云原生应用开发提供了实践参考。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<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、付费专栏及课程。

余额充值