🕒✨ تسلط بر همپوشانی زمان در TypeScript: 🚀 مقابله با چالش های نیمه شب 🌙

📌 TL ؛ در این پست ، ما چگونگی تشخیص دقیق همپوشانی های زمان در TypeScript ، از جمله موارد متقابل شب را بررسی می کنیم. شما یاد می گیرید که چگونه موارد لبه پیچیده را کنترل کنید و یک راه حل قوی را با استفاده از تکنیک های React ، TypeScript و برنامه نویسی کاربردی اجرا کنید.
repo repo github: لینک گیتوب
🎬 نسخه ی نمایشی زنده: لینک نسخه ی نمایشی
🚀 مشکل: تشخیص زمان همپوشانی
تشخیص همپوشانی زمان یک مشکل شایع در برنامه ریزی برنامه ها است. فرض کنید شما:
یک پنجره در دسترس بودن (e.g., 22:00 - 06:00)
یک پنجره رویداد/تست جدید (e.g., 23:30 - 02:00)
با توجه به اینکه هر دو نیمه شب صلیب را بررسی می کنید ، چگونه می توانید با هم همپوشانی داشته باشید؟
بیشتر پیاده سازی های ساده لوح هنگام برخورد با محدوده زمانی که طی دو روز طول می کشد ، شکست می خورند. در این پست ، ما یک راه حل قوی برای رسیدگی به همه موارد ممکن ایجاد خواهیم کرد!
🧐 درک موارد لبه
قبل از پریدن به کد ، بیایید سناریوهای احتمالی را تجزیه کنیم:
🔥 بیایید به آن پرش کنیم
یک پنجره زمانی را می توان به عنوان یک بازه نشان داد [start, end] جایی که شروع و پایان آن دقایقی از نیمه شب است
(e.g., 22:00 → 1320 mins, 06:00 → 360 mins). If end < start, it crosses midnight (e.g., 22:00 - 06:00 → [1320, 360])
ایده اصلی این است:
✅ دو فواصل با هم همپوشانی دارند اگر و فقط اگر:
segment1.start < segment2.end && segment2.start < segment1.end
🏗 اجرای راه حل
بیایید راه حل را به مراحل منطقی تقسیم کنیم:
1 ⃣ تبدیل رشته های زمان (HH: MM) به دقیقه
تبدیل یک جدول زمانی دایره ای 24 ساعته به یک دنباله خطی از دقیقه ها ، منطق را تا حد زیادی ساده می کند.
const Time24FormatToMinutes = (time: string): number => {
const [hours, minutes] = time.split(":").map(Number);
return hours * 60 + minutes;
};
2⃣ منطق بررسی همپوشانی را تعریف کنید
const checkSegmentOverlap = (
segment1: { start: number; end: number },
segment2: { start: number; end: number }
): boolean => segment1.start < segment2.end && segment2.start < segment1.end;
3 ⃣ موارد نیمه شب را اداره کنید
با اضافه کردن 24 ساعت (1440 دقیقه) به فواصل زمانی که نیمه شب گذشته است ، ایجاد یک جدول زمانی یکپارچه از دقیقه حاصل می شود.
const handleMidnightCrossing = (start: number, end: number) => ({
firstDay: { start, end: end === 0 ? 1440 : end },
secondDay: end === 0 ? { start: 0, end } : null
});
4⃣ بسته بندی منطق در قلاب React
useEffect(() => {
if (
!availableStartTime ||
!availableEndTime ||
!testStartTime ||
!testEndTime
) {
setOverlaps(true);
return;
}
const checkSegmentOverlap = (
segment1: { start: number; end: number },
segment2: { start: number; end: number }
) => {
return segment1.start < segment2.end && segment2.start < segment1.end;
};
const availableStart = Time24FormatToMinutes(availableStartTime);
const availableEnd = Time24FormatToMinutes(availableEndTime);
const testStart = Time24FormatToMinutes(testStartTime);
const testEnd = Time24FormatToMinutes(testEndTime);
// Handle special case of midnight (0 minutes)
// If end time is midnight (0), treat it as end of day (1440 minutes)
const adjAvailEnd = availableEnd === 0 ? 1440 : availableEnd;
const adjTestEnd = testEnd === 0 ? 1440 : testEnd;
// Check if each range crosses midnight
const availCrossesMidnight = availableStart >= adjAvailEnd;
const testCrossesMidnight = testStart >= adjTestEnd;
// For each range, create two "day segments" that represent
// the parts of the range before and after midnight
const availFirstDay = {
start: availableStart,
end: availCrossesMidnight ? 1440 : adjAvailEnd,
};
const availSecondDay = availCrossesMidnight
? { start: 0, end: adjAvailEnd }
: null;
const testFirstDay = {
start: testStart,
end: testCrossesMidnight ? 1440 : adjTestEnd,
};
const testSecondDay = testCrossesMidnight
? { start: 0, end: adjTestEnd }
: null;
// Check for overlap between all possible day segment combinations
const firstDayOverlap = checkSegmentOverlap(availFirstDay, testFirstDay);
const secondDayOverlap =
availSecondDay &&
testSecondDay &&
checkSegmentOverlap(availSecondDay, testSecondDay);
const crossDayOverlap1 =
availSecondDay && checkSegmentOverlap(availSecondDay, testFirstDay);
const crossDayOverlap2 =
testSecondDay && checkSegmentOverlap(availFirstDay, testSecondDay);
// If any segment combination overlaps, the ranges overlap
const hasOverlap =
firstDayOverlap ||
secondDayOverlap ||
crossDayOverlap1 ||
crossDayOverlap2;
setOverlaps(hasOverlap ?? false);
}, [availableStartTime, availableEndTime, testStartTime, testEndTime]);
✅ نتایج
با استفاده از این روش ، اکنون می توانیم به طور صحیح همپوشانی را حتی در هنگام عبور از نیمه شب تشخیص دهیم.
thoughts افکار نهایی
✅ این روش همه موارد لبه را به خود اختصاص می دهد
✅ دارای دهانه های زمانی است که از نیمه شب عبور می کنند
اگر در حال ساختن یک سیستم برنامه ریزی ، برنامه رزرو یا ابزار تقویم هستید ، این تکنیک ساعت ها اشکال زدایی را صرفه جویی می کند!
💬 بعدی چیست؟
🛠 عملکرد را با یادآوری محاسبات بهبود بخشید
📚 از این منطق در یک API پس زمینه برای تأیید درگیری های زمانی استفاده کنید
افکار خود را در نظرات به من اطلاع دهید! 🚀
🎉 کدگذاری مبارک!