برنامه نویسی

🕒✨ تسلط بر همپوشانی زمان در 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 پس زمینه برای تأیید درگیری های زمانی استفاده کنید
افکار خود را در نظرات به من اطلاع دهید! 🚀

🎉 کدگذاری مبارک!

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا