تتداخل فترتان زمنيتان عندما تبدأ كل منهما قبل انتهاء الأخرى. يشمل هذا الاختبار الاحتواء الكامل. إليك كيفية تطبيقه في Numbers على Mac لمقارنة نوافذ النشر والتحقق من التواريخ ومعالجة النهايات المتلامسة.

هذا الإجراء مخصص لمن يخطط لنوافذ النشر في جدول بيانات. جميع التواريخ والتسميات أدناه اصطناعية. ستقارن نافذتين في كل صف، وتحصل على نتيجة واضحة من دون كتابة برنامج.

ما المقصود بالتداخل؟

أولاً، حدّد ما إذا كانت الفترة تشمل لحظة انتهائها. تستخدم هذه المقالة فترة تشمل لحظة البداية ولا تشمل لحظة النهاية، ويُرمز إليها بـ [start, end). تشمل النافذة من 09:00 إلى 12:00 لحظة بدايتها وتنتهي عند الظهر. لذلك لا تتداخل معها نافذة أخرى تبدأ عند 12:00. وهذا يتوافق مع اصطلاح الأحداث في iCalendar: DTSTART شاملة وDTEND غير شاملة. RFC 5545، القسم 3.6.1.

بالنسبة إلى فترتين صالحتين موجبتَي الطول، يكون اختبار التداخل الكامل كما يلي:

A.start < B.end AND B.start < A.end

المنطق مباشر. تكون النافذتان منفصلتين إذا انتهت A قبل بدء B أو في لحظة بدئها، أو إذا انتهت B قبل بدء A أو في لحظة بدئها. إذا لم يتحقق أي من شرطي الانفصال، فهما تتشاركان وقتاً. يوضح هذا الاستنتاج أيضاً سبب عدم الحاجة إلى شرط تداخل إضافي عند الاحتواء.

لنفترض أن A تمتد من 09:00 إلى 12:00. وإذا امتدت B من 08:00 إلى 13:00، فلن تقع أي من نهايتي B داخل A، ومع ذلك تحتوي B الفترة A بأكملها. قد يفشل اختبار يسأل فقط عما إذا كانت بداية B أو نهايتها تقع داخل A في اكتشاف هذه الحالة. أما قاعدة المقارنتين فتكتشفها.

احتفظ بمجموعة الاختبارات الاصطناعية هذه بجانب جدول البيانات. كل وقت أدناه يقع في 10 نوفمبر 2026، ويستخدم الأساس الزمني نفسه.

نافذة A نافذة B النتيجة المتوقعة السبب
09:00–12:00 11:00–13:00 تداخل تقاطع جزئي
09:00–12:00 10:00–11:00 تداخل A تحتوي B
09:00–12:00 08:00–13:00 تداخل B تحتوي A
09:00–12:00 09:00–12:00 تداخل نافذتان متطابقتان
09:00–12:00 12:00–13:00 لا يوجد تداخل النهايتان متلامستان فقط
09:00–12:00 13:00–14:00 لا يوجد تداخل فجوة بين النافذتين

إعداد تواريخ وأوقات قابلة للمقارنة في Numbers

استخدم تواريخ وأوقات كاملة لنوافذ النشر المحددة بوقت. لا يمكن لوقت الساعة وحده أن يميّز بين هذا الصباح وصباح الغد. يضيف Numbers أيضاً المكونات الناقصة: إدخال وقت فقط يضيف تاريخ اليوم. يؤدي إخفاء تاريخ أو وقت إلى تغيير طريقة عرضه، بينما يظل المكوّن المخزّن مشاركاً في العمليات الحسابية. تنسيق التواريخ والعملات والمزيد في Numbers على Mac.

أنشئ جدولاً واحداً بهذه الأعمدة، واستخدم الصف 1 للعناوين:

العمود العنوان الغرض
A الزوج تسمية محايدة للمقارنة
B بداية A بداية النافذة الأولى
C نهاية A النهاية غير الشاملة للنافذة الأولى
D بداية B بداية النافذة الثانية
E نهاية B النهاية غير الشاملة للنافذة الثانية
F التحقق من الإدخال ما إذا كانت المقارنة ممكنة
G نتيجة التداخل الإجابة

حدد خلايا الإدخال في الأعمدة من B إلى E. في الشريط الجانبي Format، اختر Cell، ثم اضبط Data Format على Date & Time. اختر طريقة عرض تُظهر التاريخ والوقت كليهما. يتيح لك Smart Cell View أسفل النافذة فحص المكوّنين للقيمة المحددة. تعليمات Apple لتنسيق التاريخ والوقت.

لإنشاء المثال الأول بطريقة قابلة لإعادة الإنتاج، أدخل Sample pair في A2 والصيغ التالية في الخلايا المشار إليها. تنشئ هذه الصيغ A بالمدى 09:00–12:00 وB بالمدى 10:00–11:00 في 10 نوفمبر 2026. اعتبر كل نهاية في هذا المثال وفق توقيت UTC، وسجّل هذا الاصطلاح بجانب الجدول.

الخلية الصيغة
B2 =DATE(2026,11,10)+DURATION(0,0,9)
C2 =DATE(2026,11,10)+DURATION(0,0,12)
D2 =DATE(2026,11,10)+DURATION(0,0,10)
E2 =DATE(2026,11,10)+DURATION(0,0,11)

تنشئ DATE تاريخاً من السنة والشهر واليوم، ما يجنبك سلاسل التواريخ الملتبسة. وتقبل DURATION الأسابيع والأيام والساعات كأول ثلاث وسائط، لذا توفّر DURATION(0,0,9) تسع ساعات. هذه صيغ جداول بيانات وليست أوامر Terminal. DATE، DURATION.

لإدخال صيغة، حدد الخلية المقصودة، واكتب =، ثم أدخل التعبير واضغط Return. يدعم Numbers المقارنات بين قيم الخلايا ويعرض نتائجها المنطقية. إذا كانت إعداداتك تستخدم فاصلة كفاصل عشري، فاستخدم الفواصل المنقوطة بين وسيطات الدوال بدلاً من الفواصل. حساب القيم باستخدام البيانات في خلايا الجدول في Numbers على Mac، نظرة عامة على الدوال.

التحقق من النوافذ قبل اختبار التداخل

في هذه المهمة، اشترط أن تكون القيم الأربع معترفاً بها كتاريخ ووقت، وأن تكون النهاية متأخرة تماماً عن بدايتها المقابلة. يجب تصحيح الفترة المعكوسة. كما تحتاج نافذة النشر ذات الطول الصفري إلى قرار منفصل، لأنها لا تمثل وقتاً مشغولاً وفق الاصطلاح المختار.

أدخل هذه الصيغة في F2:

=IF(AND(ISDATE(B2),ISDATE(C2),ISDATE(D2),ISDATE(E2)),IF(AND(B2<C2,D2<E2),\"Ready\",\"Invalid window\"),\"Check dates\")

يتحقق الاختبار الخارجي مما إذا كانت كل نهاية قيمة تاريخ. ويتحقق الاختبار الداخلي من ترتيب النافذتين. تحدد ISDATE قيم التاريخ، وتتطلب AND أن تكون كل شروطها صحيحة، وتختار IF النتيجة المناسبة. ISDATE، AND، IF.

ينبغي أن يعرض المثال Ready. إذا ظهر Check dates، فتحقق من خلايا الإدخال بدلاً من اعتبار الصف نافذتين منفصلتين. وإذا ظهر Invalid window، فتحقق من تساوي النهايات أو عكس الإدخالات أو إغفال تاريخ اليوم التالي. اترك أي خطأ في الصيغة ظاهراً إلى أن تصحح سببه.

اكتشاف التداخل، بما في ذلك الاحتواء الكامل

أدخل هذه الصيغة في G2:

=IF(F2=\"Ready\",IF(AND(B2<E2,D2<C2),\"Overlap\",\"No overlap\"),\"Check inputs\")

في الصف الصحيح، تنفذ المقارنتان قاعدة التداخل مباشرةً: B2 هي بداية A، وE2 نهاية B، وD2 بداية B، وC2 نهاية A. تعيد AND القيمة true فقط عندما تنجح المقارنتان. توثيق Apple للدالة AND.

تعرض العينة Overlap لأن B تقع بالكامل داخل A. غيّر ساعة D2 إلى 8 وساعة E2 إلى 13؛ وينبغي أن تظل النتيجة Overlap، لكن مع احتواء B لـ A. غيّرهما إلى 12 و13؛ وينبغي أن تصبح النتيجة No overlap.

استخدم جدول الاختبارات السابق للتحقق من الحالات المتبقية. لإجراء مقارنات إضافية، أدخل زوجاً آخر في الصف التالي وانسخ صيغتي F وG إليه. افحص الصيغ المنسوخة للتأكد من أن مراجعها تشير إلى الصف الجديد.

يقارن هذا التخطيط النافذتين المقدمتين في كل صف. ولا يقارن تلقائياً كل نافذة في قائمة أحداث منفصلة بكل حدث آخر. إذا كانت القائمة صغيرة، فأنشئ صفاً لكل زوج مميز تريد فحصه، مع تجنب تكرار الأزواج بترتيب معكوس.

تحديد أي النافذتين تحتوي الأخرى

يجيب التداخل والاحتواء عن سؤالين مختلفين. إذا أردت أيضاً معرفة ما إذا كانت A تحتوي B بالكامل، فأضف عمود H بعنوان A contains B وأدخل:

=IF(F2=\"Ready\",AND(B2<=D2,E2<=C2),\"Check inputs\")

وللتحقق مما إذا كانت B تحتوي A، أضف عمود I وأدخل:

=IF(F2=\"Ready\",AND(D2<=B2,C2<=E2),\"Check inputs\")

تسمح اختبارات الاحتواء هذه بتشارك الحدود. لذلك تعيد النوافذ المتطابقة TRUE في كلا العمودين. إذا كانت مهمتك تتطلب وجود مسافة على الطرفين عند الاحتواء، فاستبدل المقارنتين غير الصارمتين في صيغة الاحتواء المعنية بمقارنتين صارمتين. هذا شرط تحريري إضافي؛ ولا يغيّر نتيجة التداخل.

التمييز بين التواريخ المدنية واللحظات الزمنية والإزاحات والمناطق الزمنية

حدّد معنى إدخالاتك قبل تطبيق الصيغ. فالتاريخ المدني مثل 2026-11-10 يسمّي يوماً تقويمياً من دون تحديد منطقة زمنية. وهو مناسب لتسمية نشر طوال اليوم. وتمثّل واجهة Temporal.PlainDate في TC39 هذا النوع من التواريخ مستقلاً عن المنطقة الزمنية. Temporal.PlainDate.

تحدد اللحظة الزمنية نقطة على الخط الزمني. وتصف إزاحة مثل +01:00 الفرق عن UTC في ذلك الوقت. أما المنطقة المسماة مثل Europe/Paris فتوفّر قواعد المنطقة الإقليمية. هذه معلومات مختلفة: فالإزاحة الثابتة لا تتضمن القواعد المتغيرة لمنطقة مسماة. Temporal.ZonedDateTime.

على سبيل المثال، تحدد الطوابع الزمنية الاصطناعية 2026-11-10T10:00:00+01:00 و2026-11-10T09:00:00Z اللحظة نفسها. وستؤدي مقارنة الساعات المعروضة فقط إلى ترتيب خاطئ.

تقارن صيغ جدول البيانات أعلاه القيم التي تدخلها؛ ولا تتضمن خطوة لتحويل منطقة زمنية مسماة. بالنسبة إلى النوافذ المحددة بوقت والمنشأة في مناطق زمنية مختلفة، حوّل كل نهاية أولاً إلى لحظة زمنية، وعبّر عن جميع النهايات بتوقيت UTC. احتفظ بمعلومات المنطقة الأصلية منفصلة إذا احتجت إلى إعادة بناء الجدول المحلي المقصود.

لإجراء تحويل آلي، يتمثل مسار واجهة البرمجة الموثق في إنشاء Temporal.ZonedDateTime مع منطقته الزمنية وتحويله باستخدام toInstant(). وترتّب طريقته compare() الأوقات الدقيقة. عندما يُتخطى وقت محلي أو يتكرر أثناء انتقال الإزاحة، توفر الواجهة خيارات صريحة لإزالة الالتباس، منها reject. عالج هذا الالتباس قبل استيراد القيم القابلة للمقارنة. تحويل Temporal.ZonedDateTime ومقارنته وإزالة الالتباس.

بالنسبة إلى النوافذ التي تغطي اليوم كله، أبقِ المهمة ضمن التواريخ المدنية. يمكن تمثيل فترة نشر اصطناعية تشمل الأيام من 10 نوفمبر إلى 12 نوفمبر ضمناً على أنها [2026-11-10, 2026-11-13). ويستخدم iCalendar كذلك اليوم التالي لآخر يوم مشمول كنهاية غير شاملة للحدث الذي يستمر أياماً كاملة. في Numbers، أدخل هذين الحدين بصيغ DATE كي تكون مكونات الوقت فيهما متسقة. مثال الحدث متعدد الأيام في RFC 5545.

معالجة الحالات الحدّية دون تغيير السؤال

تحتاج الفترة الممتدة طوال الليل إلى تاريخ اليوم التالي لقيمة نهايتها. فالنافذة التي تبدأ في 10 نوفمبر عند 23:00 وتنتهي في 11 نوفمبر عند 01:00 صحيحة. أما إدخال النهايتين بتاريخ 10 نوفمبر فيعكس ترتيبها. صحّح التاريخ بدلاً من تبديل القيم تلقائياً، لأن التبديل قد يخفي خطأً في الإدخال.

إذا كان ينبغي اعتبار النهايات المتلامسة تداخلاً في مهمتك المحددة، فاستخدم AND(B2<=E2,D2<=C2) داخل صيغة G2. وأبقِ التحقق من أن طول الفترة موجباً، إلا إذا كنت قد حددت بشكل منفصل كيفية التعامل مع الأحداث النقطية. فهذا يغيّر سياسة الحدود، وينبغي تسجيله بجانب الجدول.

تكتسب هذه السياسة أهمية أيضاً عند استخدام واجهات Mac الأصلية. توثّق Apple أن DateInterval في Foundation فترة مغلقة تشمل الطرفين، وتسمح بمدة صفرية. وتوفّر intersects وintersection(with:)، لكن نموذج الفترة المغلقة فيها يختلف عن اصطلاح iCalendar المستخدم هنا. عند تحديد التداخل في التقويم لفترات موجبة المدة، طبّق اختبار النهايات الصريح والصارم بدلاً من افتراض أن سياسة التقاطع في الواجهة تطابق مهمتك. DateInterval.

قبل الاعتماد على مقارنة، تحقق من ثلاثة أمور: أن لكل نهاية التاريخ والأساس الزمني المقصودين، وأن طول كلتا النافذتين موجب، وأن مثال النهايات المتلامسة يعطي النتيجة التي اخترتها. عندما تكون هذه القرارات واضحة، تتعامل المقارنتان نفسيهما مع التداخل الجزئي والاحتواء الكامل والنوافذ المتطابقة.

المصادر