ما هو اختبار التاريخ والوقت؟
اختبار التاريخ والوقت يتحقق من السلوك الذي يعتمد على الساعة — الانتهاء والتجديد والجدولة وحدود العمر والتقارير — في اللحظات المهمة: قبل كل حد مباشرة وعنده وبعده مباشرة، وفي نهايات الأشهر والسنوات، وفي 29 فبراير، وفي أيام تغيير التوقيت الصيفي، وفي أكثر من منطقة زمنية. ولأن أحداً لا يستطيع انتظار 30 يوماً من أجل اختبار، تُجعل الساعة قابلة للتحكم (ساعة محقونة أو وهمية، أو إعداد سفر عبر الزمن)، أو تُزاح التواريخ في بيانات الاختبار بحيث تبقى العلاقات بينها صحيحة.
اقرأ الدليل: اختبار التاريخ والوقت
كيفية استخدام محاكي اختبار التاريخ والوقت
- اختر القاعدة المراد اختبارها، مثل «ينتهي بعد مدة» لفترة تجريبية مدتها 30 يوماً.
- أدخل وقت البداية كما يظهر على الساعة المحلية في منطقة القاعدة (2026-01-31 10:00)، واختر المنطقة، مثل Asia/Riyadh.
- حدّد المقدار والوحدة، وهل تبقى القاعدة صالحة عند ثانية الحدّ نفسها.
- اختر منطقة ثانية للمقارنة (غالباً UTC، حيث تخزّن الخوادم الوقت)، وعدد الأشهر التي يُبحث فيها عن تغيّرات التوقيت الصيفي.
- اقرأ جدول اللحظات: جمّد ساعة تطبيقك عند كل لحظة باستخدام المقتطف، وتأكد أنه يعرض الحالة المتوقعة.
مزايا محاكي اختبار التاريخ والوقت
- خمسة أنواع من القواعد: انتهاء بعد مدة، وموعد نهائي ثابت، وتجديد دوري، وحدّ للعمر، ومهمة مجدولة يومية
- يسرد لحظات الساعة المطلوب اختبارها — في قواعد الانتهاء والمواعيد النهائية: قبل الحدّ بثانية، وعنده تماماً، وبعده بثانية — مع الحالة المتوقعة عند كل لحظة
- يرصد كل تغيّر للتوقيت الصيفي خلال فترة البحث في منطقة IANA المختارة بدقة الثانية، وينبّه إلى أوقات التشغيل التي تقع في فجوة تقديم الساعة أو تتكرر مرتين
- في الانتهاء بعد أشهر أو سنوات، يعرض ضبط نهاية الشهر (31 يناير + شهر واحد) إلى جانب ما تعطيه الدالة Date#setMonth في JavaScript؛ وفي التجديد، يعرض انحراف المواعيد المحسوبة من التجديد السابق
- يقارن لحظة الحدّ بمنطقة زمنية ثانية (UTC في خادمك، أو منطقة مستخدم آخر) وينبّه إذا تغيّر اليوم التقويمي
- يطبع مقتطف شيفرة لساعة وهمية في Playwright أو Jest أو Vitest أو Java أو Python (freezegun) أو .NET (FakeTimeProvider) أو libfaketime، ويصدّر اللحظات بصيغة CSV
مثال على محاكي اختبار التاريخ والوقت
فترة تجريبية مدتها 30 يوماً تبدأ في 31 يناير بتوقيت الرياض
الإدخال:
القاعدة: ينتهي بعد مدة · البداية: 2026-01-31 10:00 · المنطقة: Asia/Riyadh · 30 يوماً · عند لحظة الحدّ: منتهٍ بالفعل · المنطقة الثانية: UTCالنتيجة:
ينتهي في 2026-03-02T10:00:00+03:00 (2026-03-02T07:00:00Z، epoch 1772434800) · الساعات المنقضية 720
اللحظات: 2026-03-02T09:59:59+03:00 ← صالح · 2026-03-02T10:00:00+03:00 ← منتهية الصلاحية · 2026-03-02T10:00:01+03:00 ← منتهية الصلاحية · نهاية يوم 2 مارس ← منتهية الصلاحية (وعبارة «صالح حتى 2 مارس» التي تعرض التاريخ وحده مضلِّلة هنا)، إضافة إلى نهايتَي الشهرين ورأس السنة الجديدة
التحذيرات: لا يوجد في Asia/Riyadh أي تغيّر للتوقيت الصيفي — اختبر أيضاً منطقة فيها تغيّرمتى تستخدم محاكي اختبار التاريخ والوقت
- كتابة حالات اختبار الفترات التجريبية والكوبونات وروابط إعادة تعيين كلمة المرور ومدة صلاحية رموز الوصول (tokens) وتجديد الاشتراكات قبل إطلاق الميزة
- فحص مهمة مجدولة أو تقرير أو تذكير يعمل بالتوقيت المحلي قرب تغيّر التوقيت الصيفي
- مراجعة بوابة التحقق من العمر (18+) بما في ذلك المولودون في 29 فبراير
- شرح سبب إغلاق موعد نهائي محدد بالساعة 23:59 بتوقيت الرياض متأخراً ثلاث ساعات لمطوّر: قُرئ وقت الساعة المحلية نفسه على أنه بتوقيت UTC
الأسئلة الشائعة حول محاكي اختبار التاريخ والوقت
ما اختبار محاكاة التاريخ والوقت؟
هو اختبار السلوك المعتمد على الوقت بالتحكم في الساعة التي يقرؤها البرنامج — بتجميدها أو تحريكها إلى لحظات مختارة — بدلاً من انتظار التاريخ الحقيقي. وتخبرك هذه الأداة بأي اللحظات تختار لقاعدة معيّنة، وبما يجب أن يفعله البرنامج عند كل منها.
هل يغيّر المحاكي ساعة تطبيقي؟
لا. يحسب اللحظات والنتائج المتوقعة، ويعطيك مقتطفاً لتجميد الساعة في إطار الاختبار الذي تستخدمه (Playwright أو Jest أو Vitest أو Clock في Java أو freezegun أو FakeTimeProvider في .NET أو libfaketime). ويبقى تطبيقك وساعة نظامك دون أي تغيير.
لماذا تعطي إضافة شهر واحد إلى 31 يناير يوم 28 فبراير؟
تضبط معظم مكتبات التاريخ النتيجة على آخر يوم في الشهر الأقصر، كما تفعل java.time وهذه الأداة. أما الدالة Date#setMonth في JavaScript فلا تفعل ذلك: إذ تتجاوز نهاية الشهر وتنتهي في مارس. ويحذّرك المحاكي حين تختلف النتيجتان، لأن الاختبار يجب أن يحدد أيّهما يعتمدها المنتج.
ما تغيّرات التوقيت الصيفي التي يكتشفها؟
كل تغيّر في إزاحة المنطقة عن UTC بين البداية ونهاية فترة البحث، مستخرجاً من بيانات IANA للمناطق الزمنية في متصفحك ومحدداً بدقة الثانية. والمناطق التي لا تعتمد التوقيت الصيفي، مثل Asia/Riyadh، لا يظهر فيها أي تغيّر، وتقترح الأداة أن تختبر أيضاً منطقة تعتمده.
هل يُرسل أي شيء إلى خادم؟
لا. تجري الحسابات بالكامل في متصفحك، ولا يُرفع شيء مما تكتبه ولا يُخزَّن.
ملاحظات تقنية
تُحوَّل أوقات الساعة المحلية إلى لحظات زمنية ببيانات المناطق الزمنية في Intl داخل المتصفح (قاعدة بيانات IANA tz التي يأتي بها المتصفح). والوقت غير الموجود في المنطقة — داخل فجوة تقديم الساعة في الربيع — يُدفع إلى الأمام، أما الوقت الملتبس في فترة التداخل عند تأخير الساعة في الخريف فيأخذ اللحظة الأبكر؛ وتُذكر الحالتان في النتيجة. وتُكتشف تغيّرات التوقيت الصيفي بأخذ عيّنة من إزاحة المنطقة عن UTC كل ست ساعات، ثم تضييق كل تغيّر بالتنصيف حتى الثانية.
تُضاف وحدات التقويم في منطقة القاعدة: فالأيام تحافظ على وقت الساعة المحلية عبر تغيّر التوقيت الصيفي (فقد تساوي 30 يوماً 719 أو 721 ساعة، وتذكر الأداة ذلك)، والأشهر والسنوات تُضبط على آخر يوم في الشهر الأقصر، كما تفعل الدالة plusMonths في java.time. أما الدقائق والساعات فهي زمن منقضٍ دقيق.
الحدود ومنهجية القياس
تخطّط الأداة للاختبارات وتذكر النتيجة المتوقعة للقاعدة التي تصفها؛ ولا تغيّر ساعة تطبيقك ولا تشغّل اختباراتك.
تأتي قواعد المناطق الزمنية من بيانات tz في متصفحك. وقد تعمل خوادمك وأجهزتك بإصدار مختلف من بيانات tz، فتتصرف المنطقة التي تغيّرت قواعدها مؤخراً تصرفاً مختلفاً هناك — اختبر ببيانات tz التي تنشرها فعلاً.
لا تُحاكى الثواني الكبيسة، لأن وقت Unix ومعظم الأنظمة تتجاهلها.
قواعد العمل مثل «صالح حتى نهاية يوم الانتهاء» أو عيد ميلاد المولود في 29 فبراير قرارات تتخذها أنت؛ فالأداة تعرض البدائل ولا تحسمها.
المراجع
- Time Zone Databaseقاعدة بيانات tz للمناطق الزمنية في العالم وقواعد فروق التوقيت والتوقيت الصيفي تاريخياً، وتُحدَّث عدة مرات في السنة.
- RFC 3339: Date and Time on the Internet: Timestampsملف تعريف الطوابع الزمنية على الإنترنت المشتق من ISO 8601 (2026-09-23T10:15:00Z) وقواعد الإزاحة الزمنية.
- Clock — Playwrightكيف يتحكم Playwright في الوقت داخل المتصفح المختبَر: page.clock مع install وsetFixedTime وsetSystemTime وfastForward وrunFor وpauseAt، وواجهات الوقت التي يستبدلها.