纯JavaScript彩票开奖日期计算逻辑完善求助
纯JavaScript彩票开奖日期计算逻辑完善求助
嗨,我来帮你搞定这个彩票开奖日期的计算问题!你的思路已经搭好了框架,核心就是根据输入日期的星期数和具体时间,判断距离最近的周三/周六晚8点是过去还是未来,然后调整日期就行。咱们先把现有逻辑补全,再加上计算过去开奖日的函数。
先明确核心规则
首先把开奖规则理清楚:每周三(星期3)和周六(星期6)的20:00整开奖,所以判断逻辑要同时考虑「当前是星期几」和「当前时间是否过了当天的20点」这两个维度。
完善getNextLottoDraw函数(计算未来开奖日)
你的现有代码已经处理了周三的部分情况,但还缺周六的判断以及跨周的场景,我帮你补全并优化:
function getNextLottoDraw(inputDate) { // 复制输入日期,避免修改原对象(Date是引用类型,直接操作会改原数据) const date = new Date(inputDate); const dayOfWeek = date.getDay(); // 0=周日, 1=周一...3=周三,6=周六 const currentHour = date.getHours(); const currentMinute = date.getMinutes(); // 判断当前日期是否是开奖日,且还没到开奖时间 const isWednesdayBeforeDraw = dayOfWeek === 3 && (currentHour < 20 || (currentHour === 20 && currentMinute === 0)); const isSaturdayBeforeDraw = dayOfWeek === 6 && (currentHour < 20 || (currentHour === 20 && currentMinute === 0)); if (isWednesdayBeforeDraw) { // 当天是周三且还没到20点,直接设置为当天20:00 date.setHours(20, 0, 0, 0); } else if (isSaturdayBeforeDraw) { // 当天是周六且还没到20点,设置为当天20:00 date.setHours(20, 0, 0, 0); } else { // 不是开奖日,或者已经过了当天开奖时间,计算下一个开奖日 let daysToAdd; switch(dayOfWeek) { case 0: // 周日 → 下周三需要加3天 daysToAdd = 3; break; case 1: // 周一 → 下周三加2天 daysToAdd = 2; break; case 2: // 周二 → 下周三加1天 daysToAdd = 1; break; case 3: // 周三但已过20点 → 下周六加3天 daysToAdd = 3; break; case 4: // 周四 → 下周六加2天 daysToAdd = 2; break; case 5: // 周五 → 下周六加1天 daysToAdd = 1; break; case 6: // 周六但已过20点 → 下周三加4天(周六到下周三间隔4天) daysToAdd = 4; break; } date.setDate(date.getDate() + daysToAdd); date.setHours(20, 0, 0, 0); } return date; }
新增getPreviousLottoDraw函数(计算过去开奖日)
同理,我们需要反向判断,找到最近的已开奖日期:
function getPreviousLottoDraw(inputDate) { const date = new Date(inputDate); const dayOfWeek = date.getDay(); const currentHour = date.getHours(); const currentMinute = date.getMinutes(); // 判断当前日期是否是开奖日,且已经过了开奖时间 const isWednesdayAfterDraw = dayOfWeek === 3 && currentHour >= 20; const isSaturdayAfterDraw = dayOfWeek === 6 && currentHour >= 20; if (isWednesdayAfterDraw) { // 当天是周三且已过20点,直接取当天20:00 date.setHours(20, 0, 0, 0); } else if (isSaturdayAfterDraw) { // 当天是周六且已过20点,取当天20:00 date.setHours(20, 0, 0, 0); } else { // 不是开奖日,或者还没到当天开奖时间,计算上一个开奖日 let daysToSubtract; switch(dayOfWeek) { case 0: // 周日 → 上周六需要减1天 daysToSubtract = 1; break; case 1: // 周一 → 上周六减2天 daysToSubtract = 2; break; case 2: // 周二 → 上周六减2天(最近的过去开奖日是周六) daysToSubtract = 2; break; case 3: // 周三但还没到20点 → 上周六减3天 daysToSubtract = 3; break; case 4: // 周四 → 上周三减1天 daysToSubtract = 1; break; case 5: // 周五 → 上周三减2天 daysToSubtract = 2; break; case 6: // 周六但还没到20点 → 上周三减3天 daysToSubtract = 3; break; } date.setDate(date.getDate() - daysToSubtract); date.setHours(20, 0, 0, 0); } return date; }
测试示例(验证逻辑正确性)
你可以用这些例子测试函数是否符合预期:
// 测试未来开奖日 console.log(getNextLottoDraw(new Date('2024-05-22T19:30:00'))); // 周三19:30 → 当天20:00 console.log(getNextLottoDraw(new Date('2024-05-22T20:30:00'))); // 周三20:30 → 下周六20:00 console.log(getNextLottoDraw(new Date('2024-05-26T10:00:00'))); // 周日10:00 → 下周三20:00 // 测试过去开奖日 console.log(getPreviousLottoDraw(new Date('2024-05-22T19:30:00'))); // 周三19:30 → 上周六20:00 console.log(getPreviousLottoDraw(new Date('2024-05-22T20:30:00'))); // 周三20:30 → 当天20:00 console.log(getPreviousLottoDraw(new Date('2024-05-27T10:00:00'))); // 周一10:00 → 上周六20:00
关键注意点
- 每次操作都要复制输入日期对象,避免修改原始日期(Date是引用类型,直接修改会影响原数据)
- 时间判断要精确到分钟,比如刚好20:00的时候算还没错过开奖,应该取当天的开奖时间
- 反向计算过去日期时,要注意每个星期几对应的最近的过去开奖日是哪一天
备注:内容来源于stack exchange,提问作者Raj sri Selvam
相关产品推荐
相关产品推荐

