You need to enable JavaScript to run this app. React待办项目:无第三方包实现dueDatetime按日期分组统计任务
优惠活动
大模型
产品
解决方案
定价
更多

React待办项目:无第三方包实现dueDatetime按日期分组统计任务

无第三方依赖的待办任务到期时间分类实现方案

核心逻辑设计

分类的核心是消除时间比较过程中的时分秒、时区偏差,统一以「自然日零点时间戳」作为比较基准,完全基于JavaScript原生Date API实现,不引入任何第三方包。

1. 基础工具函数封装

首先实现可复用的日期归一化函数,确保不同来源的时间值在比较时处于同一计量维度:

// 获取指定日期所在自然日的本地零点时间戳
const getDayStartTimestamp = (dateInput) => {
  const targetDate = new Date(dateInput);
  // 重置当前日期的时分秒为0,消除当日不同时刻的时间差干扰
  targetDate.setHours(0, 0, 0, 0);
  return targetDate.getTime();
}

2. 核心分类函数

按照需求定义的4个分类边界完成任务匹配,输出要求的结构化对象:

  • 逾期:到期日期早于今日零点
  • 今日:到期日期等于今日零点
  • 明日:到期日期等于明日零点(今日零点时间戳加1天的毫秒数)
  • 后续日期:到期日期晚于明日零点
const groupTasksByDueCategory = (taskList) => {
  // 计算比较用的基准时间戳
  const todayStart = getDayStartTimestamp(new Date());
  const tomorrowStart = todayStart + 24 * 60 * 60 * 1000;

  // 初始化分类结果结构
  const groupedTasks = {
    overdue: [],   // 逾期任务数组
    today: [],     // 今日任务数组
    tomorrow: [],  // 明日任务数组
    upcoming: []   // 其余后续日期任务数组
  };

  // 遍历所有任务完成分类
  taskList.forEach(task => {
    const taskDueDayStart = getDayStartTimestamp(task.dueDatetime);
    if (taskDueDayStart < todayStart) {
      groupedTasks.overdue.push(task);
    } else if (taskDueDayStart === todayStart) {
      groupedTasks.today.push(task);
    } else if (taskDueDayStart === tomorrowStart) {
      groupedTasks.tomorrow.push(task);
    } else {
      groupedTasks.upcoming.push(task);
    }
  });

  return groupedTasks;
}

3. 组件内集成与数量展示

在React组件中,可在获取数据库返回的任务列表后直接调用上述分类函数,通过数组长度即可快速获取各分类的任务数量,无需额外计算。集成示例:

import { useState, useEffect } from 'react';

function TodoPage() {
  const [groupedTasks, setGroupedTasks] = useState({
    overdue: [],
    today: [],
    tomorrow: [],
    upcoming: []
  });

  // 拉取数据库任务后执行分类
  useEffect(() => {
    const loadTasks = async () => {
      // 替换为实际的数据库任务查询逻辑
      const taskRes = await fetch('/api/tasks');
      const tasks = await taskRes.json();
      setGroupedTasks(groupTasksByDueCategory(tasks));
    }
    loadTasks();
  }, []);

  return (
    <div className="todo-page">
      {/* 分类数量统计展示 */}
      <div className="task-stats">
        <span>逾期:{groupedTasks.overdue.length} 项</span>
        <span>今日:{groupedTasks.today.length} 项</span>
        <span>明日:{groupedTasks.tomorrow.length} 项</span>
        <span>后续:{groupedTasks.upcoming.length} 项</span>
      </div>
      {/* 各分类下的任务列表渲染逻辑 */}
    </div>
  );
}

模拟数据验证参考

可使用如下结构的模拟JSON数据验证逻辑正确性,假设当前日期为2024-05-13:

[
  {"id": 1, "title": "提交季度项目报告", "dueDatetime": "2024-05-10T09:00:00"},
  {"id": 2, "title": "修复登录页交互bug", "dueDatetime": "2024-05-13T14:30:00"},
  {"id": 3, "title": "准备部门周会材料", "dueDatetime": "2024-05-14T10:00:00"},
  {"id": 4, "title": "升级项目依赖版本", "dueDatetime": "2024-05-16T16:00:00"}
]

对应的分类结果为:

  • overdue:包含id为1的任务(早于2024-05-13零点)
  • today:包含id为2的任务(等于2024-05-13零点)
  • tomorrow:包含id为3的任务(等于2024-05-14零点)
  • upcoming:包含id为4的任务(晚于2024-05-14零点)

注意:如果dueDatetime字段存储的是带UTC时区标识的字符串格式,原生Date构造函数会自动完成时区解析,上述逻辑可正常兼容,无需额外适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.08 11:45:08