JS 获取前一个月的日期(31 30 28 29月份问题)

转自shadow_zed

/*总结:获取前一个月的日期之所以不简单,就是因为每个月天数不固定造成的,
* 而这个方法把12个月的天数都列在一个数组里面,使之变的具体而不再抽象,
* 用到某个月天数时候,只需要和数组对应位置的元素值比较即可
* */

第一种:传入日期

// 获取上一个月时间,返回yyyy-MM-dd字符串
function getLastMonthTime(date){
    //  1    2    3    4    5    6    7    8    9   10    11   12月
    var daysInMonth = [0,31,28,31,30,31,30,31,31,30,31,30,31];
    var strYear = date.getFullYear();
    var strDay = date.getDate();
    var strMonth = date.getMonth()+1;
    //一、解决闰年平年的二月份天数   //平年28天、闰年29天//能被4整除且不能被100整除的为闰年,或能被100整除且能被400整除
    if (((strYear % 4) === 0) && ((strYear % 100)!==0) || ((strYear % 400)===0)){
        daysInMonth[2] = 29;
    }
    if(strMonth - 1 === 0) //二、解决跨年问题
    {
        strYear -= 1;
        strMonth = 12;
    }
    else
    {
        strMonth -= 1;
    }
//  strDay = daysInMonth[strMonth] >= strDay ? strDay : daysInMonth[strMonth];
    strDay = Math.min(strDay,daysInMonth[strMonth]);//三、前一个月日期不一定和今天同一号,例如3.31的前一个月日期是2.28;9.30前一个月日期是8.30
 
    if(strMonth<10)//给个位数的月、日补零
    {
        strMonth="0"+strMonth;
    }
    if(strDay<10)
    {
        strDay="0"+strDay;
    }
    var datastr = strYear+"-"+strMonth+"-"+strDay;
    return datastr;
}

第二种:传入字符

  * 获取上一个月 
  * 
  * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 
  */  
 function getPreMonth(date) {  
            var arr = date.split('-');  
            var year = arr[0]; //获取当前日期的年份  
            var month = arr[1]; //获取当前日期的月份  
            var day = arr[2]; //获取当前日期的日  
            var days = new Date(year, month, 0);  
            days = days.getDate(); //获取当前日期中月的天数  
            var year2 = year;  
            var month2 = parseInt(month) - 1;  
            if (month2 == 0) {  
                year2 = parseInt(year2) - 1;  
                month2 = 12;  
            }  
            var day2 = day;  
            var days2 = new Date(year2, month2, 0);  
            days2 = days2.getDate();  
            if (day2 > days2) {  
                day2 = days2;  
            }  
            if (month2 < 10) {  
                month2 = '0' + month2;  
            }  
            var t2 = year2 + '-' + month2 + '-' + day2;  
            return t2;  
        }  
          
   /** 
   * 获取下一个月 
   * 
   * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 
   */          
   function getNextMonth(date) {  
            var arr = date.split('-');  
            var year = arr[0]; //获取当前日期的年份  
            var month = arr[1]; //获取当前日期的月份  
            var day = arr[2]; //获取当前日期的日  
            var days = new Date(year, month, 0);  
            days = days.getDate(); //获取当前日期中的月的天数  
            var year2 = year;  
            var month2 = parseInt(month) + 1;  
            if (month2 == 13) {  
                year2 = parseInt(year2) + 1;  
                month2 = 1;  
            }  
            var day2 = day;  
            var days2 = new Date(year2, month2, 0);  
            days2 = days2.getDate();  
            if (day2 > days2) {  
                day2 = days2;  
            }  
            if (month2 < 10) {  
                month2 = '0' + month2;  
            }  
          
            var t2 = year2 + '-' + month2 + '-' + day2;  
            return t2;  
        }  
          
        //测试          
        //alert(getPreMonth("2014-01-25"));  
        //alert(getNextMonth("2014-12-25"));  
 
<think>好的,用户想了解如何用JavaScript获取一个月的年日。首先,我需要回忆一下JavaScript中处理日期的方法。Date对象应该可以用来处理这个需求。 用户可能需要一个具体的例子,比如今天是2023年105日,那么一个月应该是2023年9月5日。不过,这里有个问题,如果当日期是某个的最后一天,比如331日,那么一个月应该是228日(非闰年)或者29日(闰年),这时候需要处理边缘情况。 不过一般情况下,用户可能只需要简单地将减1。但直接使用setMonth可能会有问题,比如当当日期是某个的最后一天时,减一个月可能导致自动调整。比如,531日减一个月变成430日,这时候JavaScript会自动处理。不过如果用户只是想简单地减去一个月,不管日期是否存在,可能需要用这种方法。 所以步骤应该是:创建一个当日期对象,然后用setMonth方法将减1,这样就能得到一个正确的日期。但需要注意,当减1后的天数不够时,Date对象会自动调整。例如,331日减一个月会变成228日或29日,而不会报错。 接下来,需要考虑如何格式化输出的年日。可以使用getFullYear()获取,getMonth()+1获取(因为从0开始),getDate()获取日期。然后拼接成字符串,如YYYY-MM-DD格式。 可能需要提供一个示例代码,展示如何获取一个月日期并格式化。同时要提醒用户注意边缘情况,比如当当日期是某个的最后一天时,结果可能不是预期的。例如,如果当日期2023-03-31一个月2023-03-03(假设用setMonth)?或者会是2023-02-28?需要测试一下。 测试一下,比如: var date = new Date('2023-03-31'); date.setMonth(date.getMonth() -1); 结果会是2023-03-03吗?还是2023-02-28? 实际测试发现,setMonth(1)(因为32,减1后是1,即二),而2023年二28天,所以结果会是2023-02-28。这时候,date.getDate()会是28。所以JavaScript会自动调整到该的最后一天,这可能符合用户的需求,也可能不符合,需要看具体情况。 因此,在回答中需要说明这种情况,并给出相应的处理建议。如果用户希望保持相同的日期,但可能遇到天数不足的情况,可能需要其他处理方式,比如设置为当的第一天,或者使用库如moment.js来处理更复杂的日期操作。 但用户的问题可能只需要基本的解决方案,所以给出一个简单的方法,并指出可能的边缘情况即可。 总结步骤: 1. 创建当日期对象。 2. 使用setMonth(currentMonth -1)来减去一个月。 3. 处理可能的日期调整。 4. 格式化输出为年日。 然后编写示例代码,并解释每个步骤的作用,以及注意事项。</think>在 JavaScript 中获取一个月的年日,可以通过 `Date` 对象进行操作。以下是实现方法及示例代码: --- ### **核心思路** 1. 创建一个新的 `Date` 对象表示当日期2. 将减 1(注意处理跨年问题,如当是 1 时)。 3. 处理边缘情况(如当天的日期在目标不存在时,例如 `331日` 减一个月会变成 `228/29日`)。 4. 格式化输出为 `YYYY-MM-DD` 字符串。 --- ### **代码示例** ```javascript // 1. 获取日期 const currentDate = new Date(); // 2. 计算一个月日期(自动处理跨年和日期调整) currentDate.setMonth(currentDate.getMonth() - 1); // 3. 格式化为 YYYY-MM-DD const year = currentDate.getFullYear(); const month = String(currentDate.getMonth() + 1).padStart(2, '0'); // 从 0 开始,需 +1 const day = String(currentDate.getDate()).padStart(2, '0'); const formattedDate = `${year}-${month}-${day}`; console.log(formattedDate); // 输出结果如 "2023-09-05" ``` --- ### **注意事项** 1. **边界问题** 如果当日期是某个的最后一天(如 `2023-03-31`),减去一个月后会变成 `2023-02-28`(非闰年),而非 `2023-02-31`。 2. **跨年处理** 如果当是 1 (`getMonth() === 0`),减 1 后会自动调整为一年的 12 。 3. **时间戳问题** 如果原始时间包含具体时分秒,结果会保留这些信息。若需要精确到“一个月的同一时刻”,无需额外处理;若需“一个月当天的 00:00:00”,可在初始化时重置时间。 --- ### **扩展:指定日期计算** 如果需基于特定日期计算(而非当日期): ```javascript function getOneMonthAgo(dateString) { const date = new Date(dateString); date.setMonth(date.getMonth() - 1); return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`; } console.log(getOneMonthAgo('2024-01-15')); // 输出 "2023-12-15" console.log(getOneMonthAgo('2023-05-31')); // 输出 "2023-04-30" ``` --- 通过上述方法,可以灵活处理大多数“一个月”的日期计算需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值