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

Java是一种具备卓越性能与广泛平台适应性的高级程序设计语言,最初由Sun Microsystems(现属Oracle公司)的James Gosling及其团队于1995年正式发布。该语言在设计上追求简洁性、稳定性、可移植性以及并发处理能力,同时具备动态执行特性。其核心特征与显著优点可归纳如下: **平台无关性**:遵循“一次编写,随处运行”的理念,Java编写的程序能够在多种操作系统与硬件环境中执行,无需针对不同平台进行修改。这一特性主要依赖于Java虚拟机(JVM)的实现,JVM作为程序与底层系统之间的中间层,负责解释并执行编译后的字节码。 **面向对象范式**:Java全面贯彻面向对象的设计原则,提供对封装、继承、多态等机制的完整支持。这种设计方式有助于构建结构清晰、模块独立的代码,提升软件的可维护性与扩展性。 **并发编程支持**:语言层面集成了多线程处理能力,允许开发者构建能够同时执行多项任务的应用程序。这一特性尤其适用于需要高并发处理的场景,例如服务器端软件、网络服务及大规模分布式系统。 **自动内存管理**:通过内置的垃圾回收机制,Java运行时环境能够自动识别并释放不再使用的对象所占用的内存空间。这不仅降低了开发者在内存管理方面的工作负担,也有效减少了因手动管理内存可能引发的内存泄漏问题。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
<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确保包含整天的最后一毫秒 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值