如何判断某日期是否为另一日期的biweekly recurrence循环日期
每两周(biweekly)循环日期校验方法
biweekly循环的核心判断逻辑非常直接:目标日期和初始日期的自然日间隔为14的整数倍,且目标日期不早于初始日期,就属于该循环的命中日期,不需要额外判断星期字段——因为间隔14天的两个日期,星期几必然完全一致。
标准校验步骤
- 第一步:标准化日期格式,把输入的字符串日期(比如案例中的
dd/mm/yyyy格式)转成无时间偏移的日期对象,统一取当日0点的时间值计算,避免夏令时、跨时区导致的天数计算误差。 - 第二步:前置合法性判断,如果目标日期早于初始日期,直接返回不符合(常规循环规则不覆盖初始日期之前的时间,有向前回溯需求可自行调整该规则)。
- 第三步:计算两个日期的自然日间隔,不要直接用小时差凑天数,避免夏令时切换导致少算/多算1小时,最终天数差出现偏差。
- 第四步:用计算出的天数差对14取余,余数为0则属于biweekly循环日期,否则不属于。
案例计算(初始日期13/01/2022,目标日期31/03/2022)
按自然日算间隔:
- 1月13日到1月31日共18天
- 2022年是平年,2月共28天
- 3月1日到3月31日共31天
总间隔天数为18+28+31=77天,77 % 14 = 7,余数不为0,因此31/03/2022不属于该初始日期的biweekly循环日期,最近的命中日期是间隔84天的07/04/2022。
简易代码实现参考(JavaScript)
function isBiweeklyRecurrence(startDateStr, targetDateStr) { // 适配dd/mm/yyyy格式解析,规避浏览器原生日期解析的兼容问题 const parseDMYDate = (dateStr) => { const [day, month, year] = dateStr.split('/').map(Number); return new Date(year, month - 1, day); // JS月份从0开始计数 }; const startDate = parseDMYDate(startDateStr); const targetDate = parseDMYDate(targetDateStr); if (targetDate < startDate) return false; // 取整消除夏令时、毫秒级偏移带来的天数计算误差 const dayDiff = Math.round((targetDate - startDate) / (1000 * 60 * 60 * 24)); return dayDiff % 14 === 0; } // 测试验证 console.log(isBiweeklyRecurrence('13/01/2022', '31/03/2022')); // 输出false console.log(isBiweeklyRecurrence('13/01/2022', '27/01/2022')); // 输出true,间隔14天 console.log(isBiweeklyRecurrence('13/01/2022', '07/04/2022')); // 输出true,间隔84天
注意:以上逻辑适用于最通用的“从初始日期开始每14天触发一次”的biweekly规则,如果你的业务规则是“每月固定周序的星期几每两周触发”这类特殊变体,再额外补充周序、星期字段的判断即可。
内容的提问来源于stack exchange,提问作者birmsi
相关产品推荐
相关产品推荐

