JavaScript如何获取满1年且匹配指定MM-DD规则的目标日期
实现逻辑
- 先计算基准阈值日期:当前日期加整整1年,输出的目标日期必须大于等于该日期,满足至少满1年的要求
- 预设允许的季度末月日列表:
['03-31', '06-30', '09-30', '12-31'],对应四个季度的最后一天 - 从基准阈值日期的所属年份开始,依次拼接四个允许的月日生成候选日期,找到第一个大于等于基准阈值的候选日期即为结果
- 若基准年的四个候选都小于基准阈值(比如基准阈值为2024-12-26,当年四个季度末都已过),直接取下一年的第一个候选
[基准年+1]-03-31即可
原生JavaScript实现(无需依赖第三方库)
function getTargetDate() { // 固定允许的月日候选,已经是两位格式无需补零 const allowedMonthDays = ['03-31', '06-30', '09-30', '12-31'] const now = new Date() // 计算当前日期加1年的基准阈值 const baseDate = new Date(now.getFullYear() + 1, now.getMonth(), now.getDate()) const baseYear = baseDate.getFullYear() // 遍历基准年的所有候选日期 for (const md of allowedMonthDays) { const [month, day] = md.split('-').map(Number) // JS月份从0开始,所以要减1 const candidate = new Date(baseYear, month - 1, day) if (candidate >= baseDate) { return `${baseYear}-${md}` } } // 当年所有候选都不满足,返回下一年第一个季度末 return `${baseYear + 1}-${allowedMonthDays[0]}` }
Moment.js实现
import moment from 'moment' function getTargetDateByMoment() { const allowedMonthDays = ['03-31', '06-30', '09-30', '12-31'] // 计算当前日期加1年的基准阈值 const baseDate = moment().add(1, 'year') const baseYear = baseDate.year() // 遍历基准年的所有候选日期 for (const md of allowedMonthDays) { const candidate = moment(`${baseYear}-${md}`, 'YYYY-MM-DD') if (candidate.isSameOrAfter(baseDate)) { return candidate.format('YYYY-MM-DD') } } // 当年所有候选都不满足,返回下一年第一个季度末 return moment(`${baseYear + 1}-${allowedMonthDays[0]}`, 'YYYY-MM-DD').format('YYYY-MM-DD') }
测试验证
输入当前日期为2021-08-04时,基准阈值为2022-08-04,遍历候选时2022-09-30为第一个大于等于阈值的日期,返回结果符合示例要求。
内容的提问来源于stack exchange,提问作者CCCC
相关产品推荐
相关产品推荐

