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

如何仅比较moment对象的时间部分?过滤及废弃警告问题

嘿,我帮你梳理下问题所在并给出解决方案!你现在遇到两个核心问题:一是filter没按预期过滤时间,二是Moment的废弃警告。咱们一个个来解决:

1. 修复Filter的时间比较逻辑

你的filter工作异常,大概率是因为直接对比了完整的日期时间moment对象,而不是仅提取时间部分做比较。完整的moment对象包含日期信息,会干扰纯时间的判断。

正确的做法是把每个start和end的时间单独提取出来,转换为可比较的格式(比如分钟数总和,或者标准化的时间字符串),再和07:00、19:00对比。

这里给你写个完整的可运行示例:

// 先确保正确引入moment
import moment from 'moment'; // 或者CommonJS的const moment = require('moment');

var arrayOfWorkDates = [
  { start: "2018-05-02T07:00:00Z", end: "2018-05-02T09:00:00Z" },
  { start: "2018-05-02T19:00:00Z", end: "2018-05-02T21:00:00Z" },
  { start: "2018-05-03T06:30:00Z", end: "2018-05-03T18:30:00Z" },
  { start: "2018-05-03T08:00:00Z", end: "2018-05-03T18:00:00Z" }
];

const filteredValidDates = arrayOfWorkDates.filter(item => {
  // 把ISO字符串转为moment对象,注意时区:如果你的业务是本地时区,可加.local()
  const startMoment = moment(item.start);
  const endMoment = moment(item.end);

  // 方式1:转换为分钟数总和(推荐,避免字符串比较的边界问题)
  const startTotalMins = startMoment.hour() * 60 + startMoment.minute();
  const endTotalMins = endMoment.hour() * 60 + endMoment.minute();
  const sevenAM = 7 * 60; // 07:00的分钟数
  const sevenPM = 19 * 60; // 19:00的分钟数

  // 保留:开始时间>=07:00 且 结束时间<=19:00的项
  return startTotalMins >= sevenAM && endTotalMins <= sevenPM;

  // 方式2:标准化时间字符串比较(需保证格式是HH:mm,补零)
  // const startStr = startMoment.format("HH:mm");
  // const endStr = endMoment.format("HH:mm");
  // return startStr >= "07:00" && endStr <= "19:00";
});

console.log(filteredValidDates);
// 输出:第一个和第四个对象,符合预期
2. 处理Moment.js的废弃警告

Moment.js从2.29.0版本开始就被官方标记为废弃状态了,所以你看到的警告是官方提示你迁移到替代库(比如dayjs、luxon,它们的API和Moment几乎一致,体积更小)。

如果暂时不想迁移,你可以:

  • 忽略警告:在代码顶部添加注释/* eslint-disable moment/no-deprecated */(如果用ESLint的话),或者在控制台里过滤掉该警告
  • 检查是否用了Moment的废弃API:比如某些时区处理方法、旧版的构造函数调用,替换为当前推荐的用法(查Moment官方文档的废弃说明)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:23:35