考证倒计时怎么排?做了个考试倒计时与复习规划工具
报名的时候觉得时间还早,临考前两周才发现书只看了三分之一。倒计时的数字挂在墙上没用,真正缺的是"今天该看多少"这个具体的数。
做了个规划工具:填考试日期和总任务量,自动把任务摊到每一天,每天打完卡看进度条。总量可以按章节数、页数或者题目数,单位随意。
一、倒计时天数怎么算
function daysBetween(from, to) {
const a = new Date(from + 'T00:00:00');
const b = new Date(to + 'T00:00:00');
return Math.round((b - a) / 86400000);
}
两个日期都强制到当天零点再相减,避免带上时分秒算出来半天。除完加 Math.round,跨夏令时的那天也不会算成 0.958 天。
考试当天不算复习日。真要算的话应该是 daysBetween(today, examDate) - 1,把考试那天留白,头一天还能再过一遍重点。
二、任务量怎么摊
跟分摊钱是一个路子:先整除,再把余数一天一分地发给前几天。
function planTasks(total, days) {
if (days <= 0) return [];
const base = Math.floor(total / days);
const rest = total - base * days;
return Array.from({ length: days }, (_, i) => base + (i < rest ? 1 : 0));
}
余数给前几天而不是后几天,理由是前面精力好、进度弹性大,真要补也补得动。这是个人偏好,反过来也没错,但结果必须可复现,不能每次刷新都变。
三、进度和重算
function progress(plan, doneCount) {
const total = plan.reduce((a, b) => a + b, 0);
const done = plan.slice(0, doneCount).reduce((a, b) => a + b, 0);
return { done, total, percent: total ? Math.round((done / total) * 100) : 0 };
}
进度按任务量算而不是按天数算。每天任务量不一样的时候,按天数算出来的百分比会骗人——还剩十天不代表还剩十分之一的内容。
总量中途要改(比如加了两套真题),得支持重算。已完成的天数保持不变,只把剩下的按新的剩余天数重摊。
四、踩过的坑
第一个坑是考试当天被算进复习日。 倒计时显示还有 30 天,摊任务的时候摊了 30 份,但考试当天早上你不可能再做题。要减掉那一天。
第二个坑是除以零。 考试日期就是今天或者已经过去,days 是 0 或者负数,Math.floor(total / 0) 得到 Infinity,页面直接崩。入口要判断并提示"考试已过或就在今天"。
第三个坑是余数分配不确定。 余数随手给某一天,每次打开当天的量都在变,看着像工具坏了。固定规则分配,结果稳定。
第四个坑是进度按天算会失真。 前面说过,任务量不均匀的时候按天算百分比会误导。必须按累计任务量算。
第五个坑是改总量之后历史打卡错位。 早期版本重算会清空所有打卡记录,用户白打。后来改成保留已完成天数,只重摊后面的。
第六个坑是日期只存了字符串没有时区概念。 new Date('2026-11-15') 被当成 UTC 午夜,在某些时区显示出来是前一天。加上 T00:00:00 之后按本地时间解析,才和用户在日期框里选的一致。
五、文章总结
倒计时这东西,给个数字不如给个今天的量。前者让人焦虑,后者让人动手。工具能做的就是每天把那个数摆在你面前。
打卡这块做了个克制:只记录做了没做,不记录做了多少。要记到具体数量的话,输入框就变成了负担,反而没人打了。工具的目的是让人每天打开看一眼,不是做详尽的学习日志。
进度条旁边还放了个按当前速度预计完成日。用已完成的天数算出日均速度,再推剩余任务还要多少天,跟考试日期一比,是提前还是来不及一目了然。这个数字比倒计时有用,因为它反映的是真实速度而不是日历。
工具里没有做社交或者分享功能,一开始就定死了单机自用。复习进度这种东西,给别人看反而变成压力,本来是帮自己规划节奏的,搞成打卡排名就本末倒置了。数据全在本地,清缓存会丢,所以导出功能一直在,格式是 JSON,可以直接再导回来,换设备的时候这一个文件就够了。
另外支持多个考试同时排。几个证一起考的时候,能看出复习任务有没有撞车,某段时间是不是排得太满。多考试视图按日期合并显示,同一天的任务累加,超量就提示。
- 点赞
- 收藏
- 关注作者
评论(0)