如何在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.
相关产品推荐
相关产品推荐

