You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript如何获取满1年且匹配指定MM-DD规则的目标日期

实现逻辑

  1. 先计算基准阈值日期:当前日期加整整1年,输出的目标日期必须大于等于该日期,满足至少满1年的要求
  2. 预设允许的季度末月日列表:['03-31', '06-30', '09-30', '12-31'],对应四个季度的最后一天
  3. 从基准阈值日期的所属年份开始,依次拼接四个允许的月日生成候选日期,找到第一个大于等于基准阈值的候选日期即为结果
  4. 若基准年的四个候选都小于基准阈值(比如基准阈值为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 15:24:01