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

如何实现双参数Vue.js全局过滤器计算两个日期的间隔天数

实现说明

先修正你现有代码的2处问题:

  • 过滤器定义时名称多了空格,'remainingday ' 要改成 'remainingday',否则调用时会匹配不到过滤器
  • Vue 过滤器传递多参数语法需要调整,原调用写法要改成 <p>{{ '05/10/2021' | remainingday('30/11/2021') }}</p>,过滤器第一个参数是 | 前面的变量,后续参数放在括号内传入

完整过滤器代码

以下代码适配你指定的 dd/mm/yyyy 日期格式,同时排除时分秒对天数计算的干扰:

// 日期解析工具:避免不同浏览器对dd/mm/yyyy格式的默认解析异常
function parseDate(dateStr) {
  const [day, month, year] = dateStr.split('/').map(Number)
  // JS的Date月份从0开始计数,所以要减1
  return new Date(year, month - 1, day)
}

Vue.filter('remainingday', function (startDateStr, endDateStr) {
  // 统一转成零点时间戳,排除时分秒影响
  const start = parseDate(startDateStr).setHours(0, 0, 0, 0)
  const end = parseDate(endDateStr).setHours(0, 0, 0, 0)
  const dayMs = 1000 * 60 * 60 * 24
  // 四舍五入避免时区误差
  const diffDays = Math.round((end - start) / dayMs)

  if (diffDays === 0) {
    return 'TODAY'
  } else if (diffDays > 0) {
    return `${diffDays} days after`
  } else {
    return `${Math.abs(diffDays)} days late`
  }
})

固定起始日期为今日的简化版本

如果不需要自定义起始日期,固定用当日作为起始,可以直接在过滤器内生成当日日期,调用和代码更简单:
调用代码简化为:

<p>{{ '30/11/2021' | remainingday }}</p>

对应过滤器代码:

function parseDate(dateStr) {
  const [day, month, year] = dateStr.split('/').map(Number)
  return new Date(year, month - 1, day)
}

Vue.filter('remainingday', function (endDateStr) {
  const start = new Date().setHours(0, 0, 0, 0)
  const end = parseDate(endDateStr).setHours(0, 0, 0, 0)
  const dayMs = 1000 * 60 * 60 * 24
  const diffDays = Math.round((end - start) / dayMs)

  if (diffDays === 0) return 'TODAY'
  return diffDays > 0 ? `${diffDays} days after` : `${Math.abs(diffDays)} days late`
})

内容的提问来源于stack exchange,提问作者lidersin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:39:01