مقال
طوابع Unix الزمنية وتعبيرات cron موضحة
طابع Unix الزمني هو مجرد عدد صحيح. تعبير cron هو مجرد خمسة حقول. كلاهما يظهران باستمرار في العمل على الخوادم، وكلاهما يُوقع الناس في أخطاء متوقعة: أحدهما بسبب المناطق الزمنية، والآخر بسبب الوحدة.
ما هو طابع Unix الزمني
طابع Unix الزمني يعدّ عدد الثواني التي مرت منذ 1970-01-01 00:00:00 UTC، وهي نقطة مرجعية تُعرف بـ Unix epoch. لهذا التعريف نتيجتان مهمتان. أولا، العداد بـUTC: لا توجد منطقة زمنية مضمنة في الرقم نفسه. 1718400000 يعني اللحظة ذاتها في كل مكان على الأرض بغض النظر عن موقع الجهاز الذي يخزنه. ثانيا، epoch مُعرَّف بالثواني لا بأي وحدة أخرى. قيمة مثل 1718400000 هي دائما ثوان منذ منتصف ليل 1 يناير 1970 UTC، ما لم يكن نظام أو بروتوكول ما قد اتخذ خيارا مختلفا صراحة. الطوابع الزمنية خالية من المناطق الزمنية بالتصميم، وهذا بالضبط ما يجعلها مفيدة للتسجيل وقواعد البيانات والاتصال بين الأنظمة حيث يجب أن تُشير الساعات في مناطق مختلفة إلى اللحظة ذاتها بشكل لا لبس فيه.

الثواني وأجزاء الألف من الثانية ومشكلة عام 2038
كثير من بيئات التشغيل الحديثة وAPIs تستخدم أجزاء الألف من الثانية بدلا من الثواني. Date.now() في JavaScript تُعيد أجزاء الألف من الثانية، لذا فإن 1718400000000 هو اللحظة ذاتها كالقيمة بدقة الثانية 1718400000. حين تتلقى طابعا زمنيا غير مألوف، يُخبرك حجمه بالوحدة: رقم من 10 أرقام هو دائما تقريبا ثوان؛ ورقم من 13 رقما هو دائما تقريبا أجزاء الألف من الثانية. مشكلة عام 2038 تنشأ من خيار مختلف: تخزين طابع زمني بدقة الثانية في عدد صحيح موقَّع بـ32-bit. الحد الأقصى لعدد صحيح موقَّع بـ32-bit هو 2147483647، وهو ما يقابل 2038-01-19 03:14:07 UTC. بعد تلك الثانية، يتجاوز العداد حدوده ليصبح عددا سالبا كبيرا ويعود التاريخ إلى 1901 على الأنظمة التي لا تتعامل مع هذا الحد. الحل هو استخدام تخزين 64-bit. معظم أنظمة التشغيل وقواعد البيانات الحالية تفعل ذلك بالفعل، لكن الأنظمة المدمجة وأجهزة الشبكة والصيغ القديمة التي ثبَّتت عرض الحقل منذ عقود لا تزال في خطر.
تحويل epoch إلى تاريخ مقروء: خطوة المنطقة الزمنية
تحويل قيمة epoch إلى تاريخ مقروء يتطلب خطوتين: استرداد مكونات تاريخ UTC من العدد الصحيح، ثم تطبيق تعويض UTC للحصول على التوقيت المحلي. الطابع الزمني نفسه بـUTC. حين تسأل ما التاريخ الذي يمثله 1718325000، الإجابة الصحيحة هي 2024-06-14 الساعة 00:30 بـUTC. في نيويورك (UTC-4 في الصيف)، تلك الثانية ذاتها تقع في 2024-06-13 الساعة 20:30 مساءً، أي في اليوم السابق: يتغير التاريخ لا الساعة فحسب. هذه هي الخطوة التي تُنتج نتائج خاطئة حين تُحذف: مطور يُسجِّل الطابع الخام بـUTC، وأداة للتقارير تعرضه بالتوقيت المحلي بدون تحويل، فيبدو التاريخ متأخرا بساعات أو يوم كامل. أداة محول الطوابع الزمنية على Sunasty تتعامل مع هذا صراحة: تُدخل قيمة epoch وتُظهر الأداة تاريخ ووقت UTC إلى جانب تاريخ ووقت جهازك المحليَين، بحيث يكون تجاوز حد اليوم كهذا مرئيا للوهلة الأولى. التحويل يعمل بالكامل في المتصفح ولا شيء تلصقه يُرسَل إلى أي مكان.

صيغة cron: خمسة حقول ونطاقات وخطوات وقوائم
تعبير cron يجدول مهاما متكررة على أنظمة تشبه Unix. الصيغة المعيارية لها خمسة حقول مفصولة بمسافات: الدقيقة (0-59)، والساعة (0-23)، ويوم الشهر (1-31)، والشهر (1-12)، ويوم الأسبوع (0-7، حيث يمثل كل من 0 و7 الأحد). النجمة (*) في حقل ما تعني "كل قيمة صالحة". التعبير 30 8 * * 1-5 يعمل الساعة 08:30 من الاثنين إلى الجمعة. النطاقات تستخدم الشرطة: 1-5 تغطي القيم 1 و2 و3 و4 و5. القوائم تستخدم الفواصل: 1,15 تعني الأول والخامس عشر. الخطوات تستخدم الشرطة المائلة: */15 في حقل الدقيقة تعني كل 15 دقيقة (0 و15 و30 و45). يمكن أن تظهر هذه المدمجات معا: 0-30/10 تعني 0 و10 و20 و30. شيء واحد لا يملكه cron هو حقل المنطقة الزمنية. يقرأ الخادم ساعة الجهاز الذي يعمل عليه، المضبوطة على المنطقة الزمنية المحلية للخادم. إذا كان الخادم يعمل بـUTC لكن المطور يتوقع التوقيت المحلي، يُطلَق الجدول في الساعة الخاطئة. القاعدة العملية هي التعامل مع جداول cron كتعبيرات بتوقيت الخادم المحلي وتوثيق المنطقة الزمنية للخادم إلى جانب سطر cron.
استخدام محول الطوابع الزمنية محليا
محول الطوابع الزمنية على Sunasty يُحول في الاتجاهين: من epoch إلى تاريخ مقروء ومن تاريخ مقروء إلى epoch. يمكنك إدخال قيمة بدقة الثانية أو بدقة جزء الألف من الثانية؛ تكتشف الأداة الوحدة من الحجم. تُظهر الأداة النتيجة بتوقيت UTC وبتوقيت جهازك المحلي جنبا إلى جنب، إلى جانب قيمتي الثواني والميلي ثانية الخام جاهزتين للنسخ. يملأ زر Now الطابع الزمني الحالي بنقرة واحدة، وهي طريقة سريعة للتحقق من وقت Unix الحالي دون فتح طرفية. لا يوجد منتقي منطقة زمنية منفصل: العمود المحلي يعكس دوما أي منطقة زمنية يكون متصفحك مضبوطا عليها حاليا. كل هذا يعمل في المتصفح. القيمة التي تلصقها في الحقل يقرأها JavaScript من جانب العميل ولا تغادر الجهاز أبدا.
الأدوات المذكورة في هذا المقال
- محوّل الطوابع الزمنيةحوّل طوابع Unix الزمنية إلى تواريخ بشرية (UTC + محلي) والعكس. يكتشف تلقائيًا الثواني مقابل الميلي ثانية.
- الفرق بين تاريخيناحسب الأيام والأسابيع والأشهر والسنوات بين تاريخين, كلياً في متصفحك، دون رفع.
- محلِّل تعبيرات Cronحلِّل تعبير cron وعاين أوقات تشغيله القادمة. خاص، داخل المتصفح.
الأسئلة الشائعة
لماذا تستخدم JavaScript أجزاء الألف من الثانية بدلا من الثواني؟
صُمِّم كائن Date في JavaScript للعمل بدقة أقل من الثانية منذ البداية، وأجزاء الألف من الثانية تُعطي دقة ألف مرة أعلى من الثواني دون الحاجة إلى فاصلة عشرية. المقايضة أن القيم أكبر، ولهذا تُنتج Date.now() رقما من 13 رقما بينما معظم الطوابع من جانب الخادم من 10 أرقام.
هل يحتاج كل خادم يُشغِّل cron إلى UTC؟
لا، لكن تشغيل الخوادم على UTC ممارسة شائعة تحديدا لأنها تُزيل الغموض. حين يكون الخادم على UTC، فإن تعبير cron مثل 0 2 * * * يعني 02:00 UTC وهذا الوقت ثابت طوال العام. على خادم في منطقة تُطبق التوقيت الصيفي، تُطلَق المهمة ذاتها في لحظة UTC مختلفة في الصيف والشتاء، وقد تُطلَق مرتين أو تُحذف مرة عند تغيير الساعات.
ما نوع التخزين الآمن للطوابع الزمنية بعد عام 2038؟
عدد صحيح موقَّع بـ64-bit يحتفظ بالطوابع الزمنية بدقة الثانية حتى عام 292277026596، وهو أبعد بكثير من أي قلق عملي. معظم قواعد البيانات الحالية تُخزِّن الطوابع الزمنية كقيم 64-bit بشكل افتراضي. إذا كنت تعمل مع مخطط قديم أو صيغة ملف ثنائية تستخدم حقول 32-bit، فإن الترحيل إلى تخزين 64-bit قبل حد عام 2038 هو الإصلاح الصحيح.