You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纯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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 09:04:41