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

基于moment.js实现Bootstrap Table带时分秒日期范围筛选

问题根因

原有日期筛选逻辑存在两个核心缺陷,导致带时分秒的时间格式筛选失效:

  • 逻辑默认将单元格内容与枚举生成的YYYY-MM-DD格式纯日期字符串做等值匹配,带HH:mm:ss后缀的时间字符串永远无法命中纯日期值
  • 未做时间边界处理,直接字符串比较无法识别带时分秒的时间属于对应自然日的范围
可行修复方案

不需要修改现有表格的DOM结构,仅调整筛选逻辑即可,全程基于moment.js做时间解析和比较,避免字符串匹配的兼容性问题:

  • 废弃原逻辑中「枚举区间内所有日期字符串、做等值匹配」的实现,统一将时间值转为moment对象做范围判断
  • 补全时间边界处理:选中的开始日期默认取当日00:00:00,结束日期默认取当日23:59:59,避免遗漏当日带时分秒的记录
  • 明确指定时间解析格式,防止moment自动解析产生偏差
核心实现代码

替换原有筛选判断逻辑为以下代码即可:

/**
 * 日期范围筛选判断函数
 * @param {string} cellVal 表格单元格内的时间值
 * @param {string} startVal 筛选框选中的开始日期 格式为YYYY-MM-DD
 * @param {string} endVal 筛选框选中的结束日期 格式为YYYY-MM-DD
 * @returns {boolean} 是否命中筛选范围
 */
function dateRangeCheck(cellVal, startVal, endVal) {
  // 解析单元格时间,同时兼容纯日期、带时分秒两种格式
  const cellTime = moment(cellVal, ['YYYY-MM-DD', 'YYYY-MM-DD HH:mm:ss']);
  // 处理时间边界
  const rangeStart = moment(startVal).startOf('day');
  const rangeEnd = moment(endVal).endOf('day');
  // 闭区间判断,包含起止两天的所有时间点
  return cellTime.isBetween(rangeStart, rangeEnd, null, '[]');
}

// Bootstrap Table列配置中绑定自定义筛选逻辑示例
$('#table').bootstrapTable({
  columns: [{
    field: 'dateField',
    title: '时间',
    // 绑定自定义筛选规则
    filterCustom: (val, rowVal) => {
      // 从筛选输入框获取起止值,替换为实际业务中使用的输入框选择器即可
      const start = $('#dateStart').val();
      const end = $('#dateEnd').val();
      // 未选择筛选范围时默认展示全部数据
      if (!start || !end) return true;
      return dateRangeCheck(rowVal, start, end);
    }
  }]
})
适配说明
  • 以上逻辑同时兼容YYYY-MM-DD纯日期、YYYY-MM-DD HH:mm:ss带时分秒两种时间格式,存量纯日期数据无需改造
  • 筛选精度支持到秒,不会出现跨日、漏选当日数据的问题
  • 不需要修改现有表格渲染的HTML结构,原有表格代码可直接复用

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:15:37