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

本文介绍了一段JavaScript代码,该代码能够计算并返回指定月份的第一天和最后一天的日期。通过使用JavaScript内置的Date对象,我们可以轻松地获取当前日期,并通过简单的计算得到每月的起始与结束日期。
 
  <script language="JavaScript" type="text/JavaScript">
var myDate = new Date();
    var year = myDate.getFullYear();
    var month = myDate.getMonth();
    if (month<10){
        month = "0"+month;
    }
    var firstDay = month+"/"+"01/"+year;
alert(firstDay);

    myDate = new Date(year,month,0);
    var lastDay = month+"/"+myDate.getDate()+"/"+year;
   // var firstTime = "00:00:00";
    //var lastTime = "23:59:59";
 alert(lastDay);
</script>

<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、付费专栏及课程。

余额充值