Quiero volver verdadero si una semana está entre dos semanas. Es decir, el período es de la semana 48 (2021) a la semana 3 (2022). Entonces quiero volver verdadero si hay una semana en el medio.
La semana de la lección y el año es lo que estoy comprobando en el medio. Semana y año de inicio y semana y año de fin es el período.
Mi código a continuación no funciona para el ejemplo (semana 48 de 2021 -> semana 3 de 2022)
Prefiero no convertir a objetos de fecha, pero si es necesario, lo haré.
const isSamePeriod = ( lessonWeek, lessonYear, startWeek, startYear, endWeek, endYear ) => { if (lessonWeek >= startWeek && lessonYear === startYear) { if (lessonWeek <= endWeek && lessonYear === endYear) { return true; } } return false; };Puede concatenar los valores como cadenas de año + semana siempre que la semana esté rellenada con ceros, luego compare, por ejemplo
const isSamePeriod = ( lessonWeek, lessonYear, startWeek, startYear, endWeek, endYear ) => { let z = n => ('0'+n).slice(-2); let lesson = lessonYear + z(lessonWeek); let start = startYear + z(startWeek); let end = endYear + z(endWeek); return lesson >= start && lesson <= end; }; // Examples [[47,2021], [48,2021], [50,2021], [ 1,2022], [ 3,2022], [ 4,2022] ].forEach( arr => console.log(arr + ' ' + isSamePeriod(...arr, 48,2021, 3,2022)) );También puede convertir los valores de la semana y el año en fechas, por ejemplo
// Convert year, week to Date // Assumes ISO week: week starts on Monday, first week // starts on Monday before first Thursday of year function yearWeekToDate(year, week) { // 4th is always in first week let d = new Date(year, 0, 4); // Shift to prior Monday if not Monday d.setDate(d.getDate() - d.getDay() + 1); // Add 7 days for each week, decrement week number // as index starts at 1 // This could be included in the above adjustment d.setDate(d.getDate() + 7 * (week - 1)) return d; } const isSamePeriod = ( lessonWeek, lessonYear, startWeek, startYear, endWeek, endYear ) => { let lesson = yearWeekToDate(lessonYear, lessonWeek); return lesson >= yearWeekToDate(startYear, startWeek) && lesson <= yearWeekToDate(endYear, endWeek) }; // Examples [[47,2021], [48,2021], [50,2021], [ 1,2022], [ 3,2022], [ 4,2022] ].forEach( arr => console.log(`${arr} ${isSamePeriod(...arr, 48,2021, 3,2022)}`) );Los cheques deben estar separados, pero tiene el segundo anidado dentro del primero. Además, solo necesita verificar la semana si los años coinciden; ver comentarios:
const isSamePeriod = ( lessonWeek, lessonYear, startWeek, startYear, endWeek, endYear ) => { return ( // Year is valid (lessonYear >= startYear && lessonYear <= endYear) || // Lesson is not in the start year or is late enough in the start year (lessonYear !== startYear || lessonWeek >= startWeek) || // Lesson is not in the end year or is early enough in the end year (lessonYear !== endYear || lessonWeek <= endWeek) ); };