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

如何在JavaScript中计算指定周时段日期并判断当前时间是否在范围内

判断当前时间是否处于重复周时段内

需求说明

需要处理以下这类重复的周内时段:

Start : Monday 1 PM 
End : Tuesday 2 PM 

Start : Friday 12 AM 
End : Monday 12 AM 

Start : Saturday 12 AM 
End : Wednesday 12 AM 

etc...

核心目标是根据当前日期计算这些时段对应的具体日期(可能是过去或未来的日期),并判断当前时间是否处于该时段内。

现有实现代码

var day_values = {
    "Sunday": 0,
    "Monday": 1,
    "Tuesday": 2,
    "Wednesday": 3,
    "Thursday": 4,
    "Friday": 5,
    "Saturday": 6,
}

var time_zone = "America/New_York";

const convertTZ = (date, tzString) => {
    return new Date((typeof date === "string" ? new Date(date) : date).toLocaleString("en-US", { timeZone: tzString }));
}

const convertTime12to24 = (hours, modifier) => {
    if (hours === '12') {
        hours = '00';
    }
    if (modifier === 'PM') {
        hours = parseInt(hours, 10) + 12;
    }
    return parseInt(hours);
}

function nextDate(day_details) {
    var dayIndex = day_values[day_details[0]];
    var today = convertTZ(new Date(), time_zone);
    today.setDate(today.getDate() + (dayIndex - 1 - today.getDay() + 7) % 7 + 1);
    today.setHours(convertTime12to24(day_details[1], day_details[2]), 0, 0);
    return today;
}

function get_start_end_dates(start_details, end_details) {
    var start_day_index = day_values[start_details[0]];
    var end_day_index = day_values[end_details[0]];
    var date = convertTZ(new Date(), time_zone); // 当前时区的日期时间
    var now_day_index = date.getDay();

    var start_day_index_diff = now_day_index - start_day_index
    var end_day_index_diff = now_day_index - end_day_index

    var start_date, end_date;
    // 情况1:开始日和结束日都在当前日之前或之后
    if ((start_day_index_diff < 0 && end_day_index_diff < 0) || (start_day_index_diff > 0 && end_day_index_diff > 0)) {
        start_date = nextDate(start_details)
        end_date = nextDate(end_details)
    }
    // 情况2:开始日和结束日都是当前日
    else if (start_day_index_diff == 0 && end_day_index_diff == 0) {
        start_date = convertTZ(new Date(), time_zone)
        start_date.setHours(convertTime12to24(start_details[1], start_details[2]), 0, 0);;
        end_date = convertTZ(new Date(), time_zone)
        end_date.setHours(convertTime12to24(end_details[1], end_details[2]), 0, 0);
    }
    // 情况3:开始日在当前日之前,结束日在当前日之后
    else if (start_day_index < now_day_index && end_day_index > now_day_index) {
        // start_date 待处理
        end_date = nextDate(end_details)
    }
    // 情况4:结束日在当前日之前,开始日在当前日之后
    // 待处理

    return { start_date, end_date };
}

// 测试用例
// 情况1
// var repeat_start = "Monday 1 AM".split(" ")
// var repeat_end = "Monday 2 AM".split(" ")
// var dates = get_start_end_dates(repeat_start, repeat_end);

// var repeat_start = "Friday 1 AM".split(" ")
// var repeat_end = "Friday 2 AM".split(" ")
// var dates = get_start_end_dates(repeat_start, repeat_end);

// var repeat_start = "Thursday 1 AM".split(" ")
// var repeat_end = "Thursday 2 AM".split(" ")
// var dates = get_start_end_dates(repeat_start, repeat_end);

// var repeat_start = "Wednesday 1 AM".split(" ")
// var repeat_end = "Thursday 2 PM".split(" ")
// var dates = get_start_end_dates(repeat_start, repeat_end);

// 情况2
// var repeat_start = "Saturday 12 AM".split(" ")
// var repeat_end = "Saturday 2 AM".split(" ")
// var dates = get_start_end_dates(repeat_start, repeat_end);

// 情况3
// var repeat_start = "Friday 1 AM".split(" ")
// var repeat_end = "Sunday 2 AM".split(" ")
// var dates = get_start_end_dates(repeat_start, repeat_end);

var repeat_start = "Monday 1 AM".split(" ")
var repeat_end = "Saturday 1 AM".split(" ")
var dates = get_start_end_dates(repeat_start, repeat_end);

// TODO:获取到对应周范围的日期后,即可判断当前时间是否处于该时段内

代码现状说明

现有代码已实现时区转换、12小时制转24小时制、计算指定周几的下一个日期等基础功能,但get_start_end_dates函数仍有两处逻辑未完善:

  • 情况3中未对start_date进行赋值
  • 情况4(结束日在当前日之前、开始日在当前日之后)的完整逻辑未实现

补充这些逻辑后,即可通过比对当前时间与计算出的start_date、end_date,完成时段判断。


内容的提问来源于stack exchange,提问作者V.J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:55:20