项目场景:
简述:表单方式收集用户信息时
例如:有效期三个月、半年、一年
问题描述:
问题:每个月天数不一致如何处理:
例如:当前日期是【2022-03-31】半年后的9月却只有30天,又要怎么使日期选定到【2022-09-30】呢
解决方案:
说明:js计算n个月后的日期,并匹配月底,处理闰年,闰月,下例代码就来解决以上问题,返回时间格式YYYY-MM-DD
//计算num个月后的时间
function getNowdate(n) {
var date_now = new Date(),
year = date_now.getFullYear(), //获取当前时间的年份
month = date_now.getMonth() + 1, //获取当前时间的月份
day = date_now.getDate(), //获取当前时间是几号
num, date_end, days; // 备用变量 后面要用
// 以下开始计算n个月后的日期
month = month + n
num = parseInt(month / 12);
if (month > 12) {
num = month % 12 == 0 ? num - 1 : num; //注:month % 12 == 0时,num-1,若12月的12个月后其实是明年的12月 num应是1 不是2
year = year + num; //月份大于12个月 年份+num
month = month % 12 == 0 ? 12 : parseInt(month) % 12; //大于12对12取余数,余数为0时=12月
}
//考虑到如果当前日期是【2022-03-31】半年后的9月却只有30天
date_end = new Date(year, month, 0); //这里可以拿到n个月后的最后一天的日期
days = date_end.getDate(); //n个月后的最后一天是几号
if (day > days) {
day = days //若n个月后没有31号,就取那个月的最后一天,例如:2022-03-31 6个月后只有 2022-09-30
}
//最后优化下时间格式
if (month < 10) {
month = '0' + month
}
if (day < 10) {
day = '0' + day
}
return year + '-' + month + '-' + day
}
// 测试时间"2022-03-31"
console.log(getNowdate(3)); // 2022-06-30
console.log(getNowdate(6)); // 2022-09-30
console.log(getNowdate(9)); // 2022-12-31
console.log(getNowdate(12)); // 2023-03-31
console.log(getNowdate(18)); // 2023-09-30
console.log(getNowdate(26)); // 2024-05-31
console.log(getNowdate(39)); // 2025-06-30
总结:
①创建时间对象
②获取当前时间的年份 月份还有几号
③对n个月后的月份做计算,超过12时 年份+1 月份%12(取余数),余数为0时取12为值
④处理类似问题 2022-03-31 半年后的9月却只有30天
⑤知道n个月后的年份跟月份后,获取那个月的总天数
⑥若n个月后的最大日期小于当前日期的号数时,就取那个月的最后一天
⑦最后优化时间格式,月 日数值小于10的,在前面加0