支持设计解读:从 weekstart 到 workweek 的演进)
开发工具【免费下载链接】taskwarriorTaskwarrior - Command line Task Management项目地址https://gitcode.com/gh_mirrors/ta/taskwarrior点击查看免费下载doc/devel/rfcs/workweek.md 是 Taskwarrior 官方 RFC 设计文档之一记录了项目对一周从哪一天开始、哪些天算工作日这一时间语义的演进思路从已落地多年的weekstart配置到计划中完全由用户自定义的workweek配置。本文以该设计文档为骨架结合 src/Context.cpp、src/commands/CmdCalendar.cpp、src/recur.cpp 等源码与测试用例完整梳理现有实现的原理、设计提案的语义细节及其对日期引用与循环任务recurrence的影响。读完本文你将理解 Taskwarrior 周界定的底层机制并掌握workweek提案中soww、eoww与recur:weekday的推导关系。现状weekstart只能二选一配置的来源与用途Taskwarrior 目前支持一周从周日或周一开始这一概念完全由配置变量weekstart决定。按照设计文档的记载这一能力大约八年前就已加入最初仅仅为了在calendar报告中正确排布日历视图——即日历的第一列是从周日还是从周一开始。此后它的用途逐渐扩散weekstart不再只影响日历排版还进一步影响了sowstart of week周起始日这一日期引用date reference的取值。默认值与取值约束在 src/Context.cpp 的默认配置中可以看到它的默认值weekstartsunday # Sunday or Monday only注释已经明确这个变量只允许sunday或monday两个值。其解析与校验逻辑位于 src/Context.cppauto weekStart Datetime::dayOfWeek(config.get(weekstart)); ... The weekstart configuration variable may only contain Sunday or Monday.); Datetime::weekstart weekStart;代码将字符串配置解析为Datetime::weekstart这个静态成员供全程序共享一旦传入既非Sunday也非Monday的值Taskwarrior 会直接抛出错误。CmdShow命令对应task show也会把weekstart作为可展示的配置项列出参见 src/commands/CmdShow.cpp。calendar 报告中的实际使用calendar报告是weekstart的主要消费者。在 src/commands/CmdCalendar.cpp 中日历渲染逻辑首先读取该静态值auto weekStart Datetime::weekstart;随后在计算每月的首日偏移、周内各列位置时反复参考weekStart例如 src/commands/CmdCalendar.cpp 中的(weekStart 1 ? 0 : 1)偏移修正。测试用例 test/calendar.test.py 也验证了rc.weekstart:Monday下calendar命令能够正常运行。为什么weekstart不再够用设计文档明确指出了两方面的诉求周末weekend的概念需要可定义。不同地区、不同职业的工作日/休息日划分差异很大硬编码周六、周日是周末无法满足所有用户。相关请求一直存在希望让周末可以被配置。每一周都有周末这一假设本身也被质疑。某些工作模式如排班制并不存在固定的周末。正是这些诉求累积之后设计文档给出了一个明确结论现在已经很清楚一个weekstart设置、加上一个固定的周末概念都不再够用了。这正是workweek提案的出发点——不再只定义一周的起点而是让用户完整地定义整个工作周。提案workweek配置项配置语法与编号规则设计文档给出的核心提案是一种极简的列表式配置workweek1,2,3,4,5这里的数字是以周日为第 0 天的星期编号day zero Sunday对应关系如下数字星期0星期日1星期一2星期二3星期三4星期四5星期五6星期六因此workweek1,2,3,4,5表示的就是典型的周一至周五工作周——工作日为周一、周二、周三、周四、周五而周日0与周六6自动落入选中的非工作日。通过调整数字列表用户可以自由定义任意组合的工作日例如六天工作制0,1,2,3,4,5、只上四天班1,2,3,4等从而天然地解决了周末可定义的诉求。由此推导出soww与eoww设计文档指出一旦有了workweek两个新的日期引用语义就可以被确定sowwstart of work week工作周起始日eowwend of work week工作周结束日。它们不再依赖固定的weekstart或固定的周末假设而是从用户配置的工作日列表直接计算得出。以workweek1,2,3,4,5为例soww就是本周的周一eoww就是本周的周五。需要说明的是这两个日期引用目前尚未在源码中实现在 src 中检索不到soww/eoww的定义它们属于该 RFC 的设计产物待功能正式排期后落地。与recur:weekday的关系设计文档特别提到workweek还能决定recur:weekday的语义——即每个工作日循环的递归任务应该落在哪些天。当前仓库中的实现是硬编码的周一至周五逻辑位于 src/recur.cpp 的getNextRecurrenceelse if (period weekdays) { auto dow current.dayOfWeek(); int days; if (dow 5) days 3; else if (dow 6) days 2; else days 1; return checked_add_datetime(current, days * 86400); }这里的逻辑非常直接若当前是周五dow 5下一次循环向后推 3 天跨过周六、周日到下周一若当前是周六dow 6向后推 2 天到周一其余工作日则推 1 天。这等价于把周末 周六 周日写死在了递归引擎里。测试 test/recurrence.test.py 正是验证这一行为一个due:friday recur:weekdays的任务第二次生成实例会落在周一从而跳过周末。而在workweek提案下recur:weekday将不再依赖上述硬编码的周末假设而是根据用户配置的工作日列表动态计算下一次循环应落在哪一天。这意味着即使某人定义workweek0,1,2,3,4,5,6七天全工作recur:weekday也能正确地做到每天循环。关联机制DOM 中的.weekday除了日历与循环任务Taskwarrior 的 DOMData Object Model引用也暴露了星期维度。在 src/DOM.cpp 中date.weekday可以作为 DOM 元素被查询例如task _get 3.due.weekday参见测试 test/dom2.test.py。weekday反映的是某日期的星期序号这与workweek中使用的编号体系周日为 0同源一旦workweek落地DOM 查询与脚本化工作流同样可以基于可配置的工作日语义扩展。影响与状态兼容性影响workweek提案一旦实现会在语义上取代或扩展weekstart的部分作用周起始不再局限于周日/周一而是由工作日列表的最小值或用户显式指定决定周末不再是固定概念而是workweek列表的补集recur:weekday、soww、eoww的取值全部跟随workweek动态变化。对于存量用户weekstartsunday|monday的语义大致可映射为workweek的一种特殊情况设计上需要做好向后兼容的过渡方案。演进状态按照文档头部的声明本设计文档仍处于Work in Progress进行中状态内容可能继续调整一旦定稿该功能才会被排入后续某个版本的发布计划。因此workweek、soww、eoww目前属于设计提案而非已实现功能生产环境使用仍应以现有weekstartsunday/monday 二选一为准。关注这一 RFC 的读者可以持续跟踪 doc/devel/rfcs/workweek.md 的版本变化并在功能落地后按本文的推导关系配置自己的工作日列表。赞分享开发工具【免费下载链接】taskwarriorTaskwarrior - Command line Task Management项目地址https://gitcode.com/gh_mirrors/ta/taskwarrior点击查看免费下载相关推荐quick_actions_ios 版本演进全解读从 Objective-C 到 Swift、从 MethodChannel 到 Pigeon、再到 UIScene 生命周期支持quick_actions_ios 版本演进全解读从 Objective C 到 Swift、从 MethodChannel 到 Pigeon、再到 UISc跨平台移动开发UI组件开发工具oneTBB 实验特性Experimental Features设计文档全解读从 Preview 特性到完全支持的演进之路oneTBB 实验特性Experimental Features设计文档全解读从 Preview 特性到完全支持的演进之路 导读 oneTBBoneAP并发编程高性能计算从安装到拿到直链网盘直链下载助手四步完整教程免客户端从安装到拿到直链网盘直链下载助手四步完整教程免客户端 改网盘直链下载助手 是一款装在浏览器里的 JavaScript 用户脚本打开支持网盘的文件页时前端上一篇Blender MMD插件终极指南免费打通3D动画创作次元壁下一篇如何在3分钟内为Blender添加专业3MF格式支持创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考