JavaScript日期调度实现:如何生成指定频次的问诊日期?
解决方法:用JavaScript生成指定次数的周三/周五问诊日期
嘿,这个需求我之前帮朋友处理过,核心就是一步步筛选出符合要求的日期,我给你拆解下思路,再附上可直接复用的代码:
核心思路
- 先明确JavaScript的星期取值规则:
Date.getDay()返回0(周日)到6(周六),所以我们要找的周三对应3,周五对应5。 - 优先判断起始日期(默认是今天)是否本身就是周三/周五——如果是,这一天直接算第一次问诊,加入结果列表。
- 从起始日期开始,每天往后推一天,每次检查当前日期是否是目标星期,符合条件就加入列表,直到凑够X次问诊的日期。
完整代码实现
function getVisitDates(totalVisits, startDate = new Date()) { // 定义目标星期:周三(3)、周五(5) const targetWeekdays = [3, 5]; const visitDates = []; // 创建起始日期的副本,避免修改原日期对象 let currentDate = new Date(startDate); // 先检查起始日期是否符合要求,符合就加入列表 if (targetWeekdays.includes(currentDate.getDay())) { visitDates.push(new Date(currentDate)); totalVisits--; } // 循环找剩余的问诊日期 while (totalVisits > 0) { // 往后推一天 currentDate.setDate(currentDate.getDate() + 1); // 如果当前日期是目标星期,加入列表 if (targetWeekdays.includes(currentDate.getDay())) { visitDates.push(new Date(currentDate)); totalVisits--; } } // 格式化日期为YYYY-MM-DD格式,可按需调整 return visitDates.map(date => { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; }); } // 示例用法:生成5次问诊的日期(从今日开始) const visits = getVisitDates(5); console.log(visits);
关键细节说明
- 日期对象的副本处理:每次往列表里加日期时用
new Date(currentDate),因为JavaScript的Date是引用类型,直接push会导致后续修改影响列表里的日期。 - 灵活的起始日期:函数支持传入自定义起始日期,比如指定某一天作为“今日”,只需调用
getVisitDates(3, new Date('2024-05-20'))即可。 - 可定制的日期格式:最后用
map转成了YYYY-MM-DD字符串,你可以根据需求改成带时间的格式,或者其他地区习惯的格式。
测试场景示例
- 如果今日是周四(2024-05-23),调用
getVisitDates(3)会返回:["2024-05-24", "2024-05-29", "2024-05-31"](周五、下周三、下周五) - 如果今日是周三(2024-05-22),调用
getVisitDates(3)会返回:["2024-05-22", "2024-05-24", "2024-05-29"](今日、周五、下周三)
内容的提问来源于stack exchange,提问作者chilbofuentes
相关产品推荐
相关产品推荐

