news 2026/9/13 17:28:45

Super Productivity 定时任务机制解析:到期日、到期时间与提醒如何驱动 Today、Schedule 与 Scheduled List

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Super Productivity 定时任务机制解析:到期日、到期时间与提醒如何驱动 Today、Schedule 与 Scheduled List

Super Productivity 定时任务机制解析:到期日、到期时间与提醒如何驱动 Today、Schedule 与 Scheduled List

【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivity

Super Productivity 中的定时任务(Scheduled Tasks)是带有到期日(due date)、可选到期时间(due time)和提醒(reminder)的任务,它决定了任务在 Today View、Schedule 时间轴和专用定时任务列表中的呈现方式。本文基于仓库文档 4.12-Scheduled-Tasks 的核心概念展开,并结合 task.selectors.ts、task-due.effects.ts 等源码,讲解调度的独立性、逾期任务的处理规则、各视图的展示逻辑,以及"later today"过滤在代码层面是如何实现的,帮助读者既能正确使用定时任务,也能理解其底层数据流。

定时任务的概念:调度数据与完成状态相互独立

在 Super Productivity 中,"定时任务"并不是一个独立的任务类型,而是普通任务上的一组调度字段:到期日、到期时间、提醒时间。文档给出的定义是:Scheduled tasks in Super Productivity are tasks that have a due date, and optionally a specific due time and a reminder.调度的作用是把工作"钉"在某个日期或某个时刻上,使其出现在 Today View、Schedule 时间轴以及专用的 scheduled-tasks 列表中。

调度和完成状态是相互独立的。当你为一个任务设置到期日、到期时间或提醒时,应用只更新任务的调度数据,不会改变任务的完成状态。这意味着:

  • 你可以为一个未完成的任务排期;
  • 可以完成任务后仍保留其到期日;
  • 无论任务是否已完成,都可以随时重新排期。

这种分离让"调度"表达计划(你打算何时做某事),"完成"表达现实(你实际做了什么),两者互不覆盖。

从源码结构看,这种独立性体现在字段层面:任务模型中dueDay(到期日,YYYY-MM-DD 字符串)与dueWithTime(到期时间戳,毫秒数)是各自独立的字段,与任务的isDone完成标记没有任何联动写入。task.selectors.ts 中的选择器按这两个字段分别筛选任务,正是这种"调度字段独立于状态"设计的直接体现:

export const selectTasksDueForDay = createSelector( selectAllTasksInActiveProjects, (tasks: Task[], props: { day: string }): TaskWithDueDay[] => { return tasks.filter( (task) => !!task && task.dueDay === props.day, ) as TaskWithDueDay[]; }, ); export const selectTasksWithDueTimeForRange = createSelector( selectAllTasksInActiveProjects, (tasks: Task[], props: { start: number; end: number }): TaskWithDueTime[] => { return tasks.filter( (task) => !!task && typeof task.dueWithTime === 'number' && task.dueWithTime >= props.start && task.dueWithTime <= props.end, ) as TaskWithDueTime[]; }, );

值得注意的细节是selectTasksDueAndOverdueForDay的实现:由于dueDay采用 YYYY-MM-DD 格式,字符串按字典序比较即可正确判断"到期日小于等于某日",从而避免创建 Date 对象带来的时区转换问题——这是文档所说"字符串比较正确工作"这一行为在源码中的依据。

设置调度:调度对话框、快捷按钮与提醒

在实际操作中,设置到期日、时间和提醒的方式由 2.05-Manage-Scheduled-Tasks 完整定义,这里完整继承其关键操作步骤:

打开调度对话框

  • 右键菜单方式:右键点击任务,菜单顶部有一排图标按钮:Schedule today(太阳图标)、Schedule tomorrowSchedule next week,以及一个日历图标。点击日历图标打开完整的调度对话框;若任务已有排期,tooltip 会显示 "Reschedule",并提示默认快捷键S
  • 键盘方式:聚焦任务(点击或用方向键选中)后按S("Schedule task" 的默认快捷键)。

排期到某一天

  1. 打开调度对话框;
  2. 在日历中点击一个日期,或使用顶部的快捷按钮(Today / Tomorrow / Next week / Next month),选中日期会高亮;
  3. 点击底部的Schedule按钮。任务将在该日到期,不带具体时间。

排期到具体时间点

  1. 打开调度对话框;
  2. 在日历中选择日期
  3. Time字段(时钟图标)输入 HH:MM 时间(如 09:00 或 21:00),可用时间选择器或直接键入;点击字段右侧的X图标可清除时间;
  4. 点击Schedule,任务会在 Schedule 视图的该时间点出现。

快速排期(不打开对话框)

右键任务后,直接点击菜单顶部的图标按钮即可立即排期并关闭菜单:

  • 太阳图标— Schedule today(仅排到今天,不带时间);
  • Tomorrow 图标— Schedule tomorrow;
  • Next week 图标— Schedule next week(按本地化规则取下一周的第一天)。

要选任意日期或设置时间,则仍需用日历图标打开完整对话框。

为定时任务设置提醒

  1. 打开调度对话框并设置Time——Remind at下拉框仅在已设置时间后才出现;
  2. Remind at中选择提醒时机,应用提供的选项为:Neverwhen it starts5 minutes before it starts10 minutes before it starts15 minutes before it starts30 minutes before it starts1 hour before it starts
  3. 点击Schedule

当提醒弹窗出现时,可选择稍后提醒(snooze)、取消排期(unschedule)、关闭提醒、加入今天(add to today)、开始、完成等动作。直接点击弹窗外区域或按 Escape 只是关闭弹窗:定时任务提醒会保持激活状态,稍后再次弹出,直到你做出处理;而截止提醒(deadline reminders)在关闭后即被清除。

取消排期

  • 右键菜单:对已排期任务,日历图标旁有Unschedule task按钮(event_busy 图标),点击即可清除到期日和时间;
  • 调度对话框:若任务已有到期日或时间,对话框中会出现Unschedule按钮(alarm_off 或 event_busy 图标);
  • 键盘:聚焦任务后按U("Unschedule task" 的默认快捷键,如已配置)。

调度与 Today View:基于到期日的成员资格计算

Today View 用一条基于时间的规则决定哪些任务出现:一个任务的到期日是今天,或者其到期时间落在今天,它就"属于今天"。应用并不在任务上使用 "today" 标签;今天列表的成员资格完全由到期日(及到期时间)推导而来。Today View 中任务的排序是单独存储的(你可以拖拽重排),而成员资格(一个任务是否出现)始终由任务的调度字段计算得出。这保证了单一数据源:到期日和时间同时驱动 Schedule 和 Today 列表。

从源码结构看,"虚拟 TODAY 标签"架构正是这一设计的实现:task.selectors.ts 中有一处关键注释——With the virtual TODAY_TAG architecture, overdue tasks (dueDay < today) can never be on today's list (dueDay === today),即今天列表的成员资格判定本质上就是dueDay === today的比较,而不是维护一个真实的标签成员集合。

task-due.effects.ts 中的三个 effect 则负责在日期变化时维护这一成员资格:

  • createRepeatableTasksAndAddDueToday$:在todayDateStr$变化(跨天)且同步完成后,调用addAllDueToday(),把到期任务与重复任务实例加入今天的计划。代码注释还记录了一个已知缺陷(#6230):该 effect 只在日期字符串变化时触发,跨天后当天内不再有复查,若凌晨附近因浏览器定时器节流或系统休眠导致错过触发,重复任务要等下一次日期变化或应用重启才出现;
  • removeOverdueFormToday$:跨天时读取selectOverdueTasksOnToday,把逾期任务从今天列表中移除。注意它派发的是非持久化actionlocalRemoveOverdueFromToday,注释解释这样做是为了避免与其他设备上的用户操作产生 LWW(last-write-wins)冲突(#6992)——每台设备独立运行该 effect,同步这次移除是冗余的;
  • ensureTasksDueTodayInTodayTag$:一个防御性 effect,交叉检查selectTasksDueForDay(按dueDay)与selectTasksWithDueTimeForRange(按dueWithTime落在今天的毫秒区间)两类到期任务,确保所有"今天到期"的任务都出现在今天的任务集合中。由于设置了dueWithTime的任务会清空dueDay(两者互斥),必须同时检查两个选择器才能捕获全部已排期任务——这段逻辑正是文档所说"到期日或到期时间落在今天即属于今天"在实现层的直接对应。

逾期任务会发生什么:不自动变更,靠提醒与用户决定

应用不会在任务逾期时自动修改或删除它。到期日在昨天的任务仍以该到期日留在系统中,在完成、重新排期或删除之前一直是未完成状态。提醒(按任务配置)可以在选定时间通知你,帮助你关注即将到期或已逾期的工作,但提醒不改变任务的到期日或完成状态。

在 Today View 中,应用聚焦于当下可执行的事项。当你处于 Today 上下文时,今天稍后才到期的任务(到期时间仍在未来的任务)可以从主列表中过滤掉,让你只看到当前已到期或今天更早到期的任务、以及没有具体时间要求的任务。这减少了干扰,帮助你专注下一步。这些稍后才到期的任务仍是排期状态,到时间时会在 Today 列表出现,或始终出现在 Schedule、定时任务列表中——只是在 Today 列表中被临时隐藏。

另一个规则由应用行为控制:排期到今天的任务留在今天列表中;排期到未来日期的任务则从今天列表移除,转而出现在那一天的 Planner 和 Schedule 中。

"later today"过滤在源码中有专门的实现:task-later-today.selectors.spec.ts 测试的selectLaterTodayTasksWithSubTasks选择器按文档注释所述拆分为"基于快照的结构决策(selectLaterTodayStructure → 有序的 {id, subTaskIds})+ 基于实时实体的重映射"两部分,配合 later-today-window.spec.ts 中的时间窗工具函数,共同决定哪些任务被归入"今天稍后"。work-context.service.ts 则根据当前工作上下文(Today、Planner 等)参与决定这一过滤是否生效,而 get-later-today-calendar-events.ts 说明日历事件中同样存在对应的 later-today 分离逻辑。

各视图中定时任务的呈现方式

定时任务在多处呈现,各处目的不同。

Today View

Today View 展示今天到期的任务:到期日是今天、或到期时间落在今天的任务都会出现。任务顺序就是你设置的顺序(如拖拽得到的),该顺序被保存;成员资格——"这个任务属于今天吗"——始终由到期日和时间决定,而非标签。因此把任务排到今天(或把到期日改成今天),它就会出现;把到期日改成其他天,它就离开 Today View。当 Today 列表被过滤为"立即可执行项"时,今天稍后才到期的任务可能在其时间临近前被隐藏。

Scheduled List(带时间的任务列表)

专用的定时任务列表(scheduled-tasks 页面)展示所有带有具体到期时间的任务——不只是到期日,而是日期加时间。该列表包含未来和过去的定时任务,让你在一个地方看到所有曾经或正在被时间化的安排,每个任务显示其日期和时间(若设置了提醒也一并显示)。该视图适合回顾"我排了什么、排在何时",而不像 Schedule 那样使用时间轴布局。

在仓库中对应实现是 scheduled-list-page 页面:它先渲染重复任务配置(REPEATED_TASKS 区块),随后通过tasksPlannedWithTime$选择器渲染所有带到期时间的任务,与文档描述一一对应。

Schedule View

Schedule View 在未来 30 天的时间轴上展示任务:

  • 带有到期日和时间的任务以"块"的形式出现在对应时间;块在时间轴上的时长来自任务的时间估计(未设置时取默认值);
  • 只有到期日(无具体时间)的任务作为"弹性工作"出现,在时间固定的任务周围"流动"排布。

因此 Schedule 视图是查看定时任务"一天中的何时发生、如何与其他工作搭配"的地方。可参见 4.04-Schedule-View 与 4.08-Time-Estimates。

工作上下文与 "Later Today" 过滤

当你的工作上下文是 Today View 时,应用可以过滤掉今天稍后才排期的任务,使列表强调当下可做的事。今天更早到期的任务、或今天到期但无具体时间的任务留在列表中;到期时间仍在今天未来的任务则被隐藏,直到那个时刻。它们没有被删除或改期,只是在 Today 上下文中被隐藏以减少噪音。已开始跟踪任务时间的任务总是显示在主列表中,即使其到期时间还没到。在其他上下文(Schedule、定时任务列表)中,这些任务仍然出现。

小结:调度机制一览

  • 调度只更新任务的到期日、到期时间和提醒,不改变完成状态;
  • Today 成员资格仅基于到期日(及到期时间)计算——没有 "today" 标签,由应用推导(源码中体现为"虚拟 TODAY 标签"与dueDay === today的比较);
  • 逾期任务不被自动处理;提醒可以通知你,但任务在完成或重新排期之前保持原样;
  • Today 列表可隐藏"今天稍后"的任务以聚焦当下;这些任务仍出现在 Schedule 和定时任务列表中;
  • 排到今天的任务留在今天列表;排到未来日期的任务离开今天列表,出现在该日的 Planner 和 Schedule 中(跨天维护由 task-due.effects.ts 中的removeOverdueFormToday$ensureTasksDueTodayInTodayTag$等 effect 保障)。

相关文档

  • 2.05-Manage-Scheduled-Tasks — 如何设置到期日、时间和提醒
  • 4.01-The-Today-View — Today 列表如何使用到期日和时间(及 "later today" 过滤)
  • 4.04-Schedule-View — Schedule 时间轴如何展示定时任务
  • 4.03-Planner-View — 天级规划(有日期但无时间的任务)
  • 4.09-Task-Attributes — 到期日、到期时间和提醒在任务模型中的位置

【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivity

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/13 17:25:00

51单片机气体监测系统:ADC0832+LCD12864仿真与硬件闭环实现

简介&#xff1a;本资源是一套面向电子类专业学生与单片机初学者的完整焊机气体监测系统设计资料&#xff0c;聚焦焊接安全场景下的实时气体状态感知与智能保护逻辑实现。资源包含Proteus仿真工程、Keil C源码、AD原理图及配套论文&#xff0c;覆盖从硬件选型、传感器信号采集&…

作者头像 李华
网站建设 2026/9/13 17:24:48

车规级CAN超时丢包抖动的本质与根因诊断

1. 车规级CAN通信的“容错”不是容错&#xff0c;是设计哲学你有没有遇到过这样的场景&#xff1a;整车厂发来一份故障报告&#xff0c;写着“某ECU在冷启动后30秒内偶发报文超时&#xff0c;持续2~3帧&#xff0c;之后自动恢复”&#xff0c;附带一段CANoe抓取的MF4日志&#…

作者头像 李华
网站建设 2026/9/13 17:24:38

完全免费!001-计算机实验报告之数据库原理实验报告

免费赠送&#xff01;&#xff01;&#xff01;需要的关注&#xff01;&#xff01;&#xff01;VX同名一共四个实验&#xff0c;分别是&#xff1a;1、使用powerdesigner建模&#xff1b;2、在idea里操作数据库&#xff1b;3、在数据库实现多种查询&#xff0c;如简单查询&…

作者头像 李华
网站建设 2026/9/13 17:22:28

Kronos K线预测教程:5行代码跑出第一次股价预测

Kronos K线预测教程&#xff1a;5行代码跑出第一次股价预测 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 把一份K线CSV丢给Kronos&#xff0c;它能接着最…

作者头像 李华