الطابع الزمني Unix: ما هو وكيف تحوله إلى تاريخ مقروء؟
شرح رقم الـEpoch الذي تستخدمه الأنظمة لتخزين الوقت، والفرق بين الثواني والميلي ثانية، وسبل التحويل بينه وبين التاريخ العادي، وملاحظات المناطق الزمنية والتواريخ السالبة.
عندما تفحص استجابة واجهة برمجية (API)، أو تراجع سجلات خادم، أو تستعلم من جدول مستخدمين في قاعدة بيانات، ستصادف حتمًا أرقامًا صحيحة مجردة مثل 1700000000 أو 1768480200. هذا الرقم ليس شفرة مبهمة، بل هو «الطابع الزمني ليونكس» (Unix Timestamp أو POSIX Epoch): الطريقة العالمية الأكثر ثقة وموثوقية في هندسة البرمجيات لتمثيل اللحظات الزمنية بشكل مستقل تمامًا عن فوارق اللغات، والتقاويم المحلية، وتنسيقات التواريخ.
ما هي نقطة الصفر الزمنية (Unix Epoch) ولماذا اختيرت؟
يمثل الطابع الزمني عدد الثواني المنقضية بدقة منذ منتصف ليل 1 يناير 1970 بتوقيت غرينتش العالمي الموحد (00:00:00 UTC). وقد وقع الاختيار على هذا التاريخ في أوائل سبعينيات القرن الماضي عند تطوير نظام التشغيل Unix في مختبرات بيل (Bell Labs) ليكون نقطة مرجعية ثابتة ومريحة لأنظمة الحوسبة الحديثة، مما ألغى الحاجة لتخزين نصوص طويلة ومعقدة مثل «الخميس 15 يناير 2026 الساعة 03:30 مساءً» واستبدالها برقم صحيح واحد خفيف الوزن يمكن فرزه ومقارنته في المعالج بدورة حسابية واحدة.
الفخ الأكبر: الثواني (10 خانات) مقابل الميلي ثانية (13 خانة)
أحد أكثر الأخطاء التي تسبب أعطالًا في المنصات البرمجية هو الخلط بين وحدتي الثواني والميلي ثانية:
- أنظمة الثواني (Seconds): قياسية في أنظمة Linux، ولغات مثل Python (`time.time()`)، وPHP (`time()`)، وقواعد بيانات PostgreSQL وMySQL. يتكون الطابع الزمني في عصرنا الحالي من 10 خانات (مثل 1,700,000,000).
- أنظمة الميلي ثانية (Milliseconds): معيارية في بيئات JavaScript والواجهات الأمامية (`Date.now()` أو `new Date().getTime()`) وبيئة Node.js ولغة Java (`System.currentTimeMillis()`). يتكون الطابع الزمني من 13 خانة (مثل 1,700,000,000,000).
- المشكلة العملية: إذا قمت بتمرير رقم بالميلي ثانية إلى نظام ينتظر ثوانٍ، فسيقفز التاريخ فجأة إلى آلاف السنين في المستقبل (سنة 55800 تقريبًا). والعكس صحيح؛ تمرير الثواني لدالة جافاسكربت يعيدك فورًا إلى بدايات شهر يناير سنة 1970. لحسن الحظ، يقوم محولنا في أدواتي باكتشاف الوحدة تلقائيًا بناءً على القيمة المطلقة للمدخل.
المناطق الزمنية والتوقيت الصيفي: أين يقع الخلط؟
الطابع الزمني Unix يمثل «لحظة كونية مطلقة» (Absolute Instant) لا تتبع أي منطقة زمنية على الإطلاق؛ فهو نفسه تمامًا في طوكيو، والرياض، ولندن، ونيويورك في نفس اللحظة التي يقع فيها الحدث. الفرق ينشأ فقط عندما نقوم بـ «عرض» هذا الرقم كنص بشري مقروء (Human-Readable Representation):
- التوقيت العالمي (UTC): هو المعيار القياسي لتخزين ومبادلة البيانات عبر الخوادم والـ APIs لتجنب أي سوء تفاهم.
- التوقيت المحلي (Local Time): يتحدد بناءً على إزاحة المنطقة الزمنية لنظام تشغيل المستخدم (مثل UTC+3 في الرياض أو القاهرة بحسب التوقيت المعمول به).
- التوقيت الصيفي (DST): لا يؤثر على الطابع الزمني نهائيًا، بل تطبقه مكتبة التاريخ فقط عند تحويل الطابع إلى نص محلي في البلدان التي تعتمد تغيير التوقيت فصليًا.
معضلة عام 2038 (Year 2038 Problem / Y2038) وحدود لغات البرمجة
تعتمد الأنظمة القديمة ذات المعالجات أو هياكل البيانات 32-بت على عدد صحيح ذي إشارة (Signed 32-bit Integer) لتخزين الثواني. الحد الأقصى الموجب الذي يمكن لمتغير 32-بت تخزينه هو 2,147,483,647 ثانية، والذي يوافق بدقة يوم الثلاثاء 19 يناير 2038 في تمام الساعة 03:14:07 بتوقيت UTC. في الثانية التالية مباشرة، سيفيض الرقم (Integer Overflow) ليتحول إلى قيمة سالبة (-2,147,483,648)، مما يُرجع الأنظمة القديمة إلى سنة 1901.
في أنظمة التشغيل وقواعد البيانات الحديثة، تمت الترقية إلى أعداد صحيحة 64-bit، مما يمدد صلاحية تمثيل الثواني لمئات مليارات السنين. أما في بيئة متصفح الويب ولغة JavaScript، فيجب الانتباه لفارق تقني دقيق: كائن `Date` القياسي ومحرك الجافاسكربت يعتمد تمثيلاً رقمياً بحدود ±8,640,000,000,000,000 ملي ثانية بالنسبة لنقطة الصفر، وهو ما يغطي نطاقاً زمنياً آمناً يقارب 273,790 سنة قبل الميلاد وبعده (وليس مليارات السنين بلا نهاية). كما أن أقصى عدد صحيح دقيق بلا فقدان دقة هو `Number.MAX_SAFE_INTEGER` (وهو 9,007,199,254,740,991). وتدعم أداتنا هذا النطاق بالكامل مع معالجة التواريخ الموجبة والسالبة بدقة متناهية.
التعامل مع التواريخ السالبة قبل 1970
كثير من المستخدمين يعتقدون أن تواريخ الميلاد قبل 1970 لا يمكن تمثيلها بـ Timestamp؛ والحقيقة أن المعيار يدعم التواريخ السابقة عبر الأرقام السالبة تمامًا؛ فالطابع -86400 يمثل يوم 31 ديسمبر 1969، بينما الطابع -315619200 يمثل مطلع عام 1960. تدعم منصة أدواتي التحويل الرياضي الكامل للقيم السالبة والموجبة على حد سواء.
المصادر التقنية وتاريخ التحقق
تم تدقيق المرجع الزمني والحدود الحسابية وفق التوثيق الرسمي لشبكة مطوري موزيلا (MDN Web Docs - JavaScript Date Specification): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date (تاريخ المراجعة والتحقق: أكتوبر 2026).
جرّب بنفسك: محول الطابع الزمني Unix Timestamp
طبّق ما قرأته مباشرة عبر الأداة المجانية — الحساب يتم محليًا في متصفحك.
أسئلة شائعة
لماذا يختلف التاريخ بساعات عند تشغيل الكود بين جهازي والخادم؟
لأن الخوادم السحابية تُضبط افتراضيًا على توقيت UTC، بينما جهازك الشخصي يعرض التاريخ بتوقيت منطقتك المحلية (مثل توقيت مكة المكرمة UTC+3). اللحظة الزمنية في الطابع واحدة تمامًا، ولكن طريقة العرض تتأثر بإعدادات البيئة المحلية.
كيف أقوم بتحويل التاريخ الحالي إلى Timestamp في سطر أوامر سريع؟
في أنظمة Linux وmacOS اكتب الأمر `date +%s`، وفي JavaScript اكتب `Math.floor(Date.now() / 1000)` للثواني، وفي Python اكتب `import time; int(time.time())`.
هل تُحسب الثواني الكبيسة (Leap Seconds) داخل Unix Timestamp؟
لا؛ وفقًا لمعيار POSIX، فإن كل يوم في زمن يونكس يُفترض أن طوله بالضبط 86400 ثانية. عند حدوث ثانية كبيسة فلكية، تقوم الأنظمة بتكرار ثانية أو تعديل تردد الساعة تدريجيًا (Leap Smearing) لمنع قفز الطابع الزمني.
ما الفرق بين صيغة ISO 8601 وطابع Unix الزمني؟
صيغة ISO 8601 هي تمثيل نصي معياري واضح للبشر (مثل `2026-01-15T12:30:00Z`)، بينما طابع Unix هو قيمة رقمية مجردة (مثل `1768480200`). كلاهما مرجع مطلق غير غامض، ويفضل استخدام الأرقام في قواعد البيانات لسرعة الفهرسة والحساب.
مقالات ذات صلة
JSON: التنسيق والتحقق وإصلاح الأخطاء الأكثر شيوعًا
قواعد صيغة JSON الصارمة التي تسبب معظم أخطاء التحليل: الفواصل الزائدة، علامات الاقتباس، والتعليقات الممنوعة — وكيف تحدد موضع الخطأ وتصلحه بسرعة.
اقرأ المزيدUUID: كيف يكون المعرف فريدًا عالميًا دون تنسيق مع أحد؟
بنية UUID v4 ومعنى خاناته الست عشرية، واحتمال التصادم الحقيقي بين 122 بت عشوائية، ومتى تستخدمه بدل الأرقام التسلسلية في قواعد البيانات.
اقرأ المزيدترميز عناوين URL: لماذا يتحول النص العربي إلى %D8%A3؟
ما ترميز النسبة المئوية في الروابط، والفرق بين ترميز جزء من الرابط وترميزه كاملًا، وكيف تُبنى روابط عربية سليمة لا تنكسر، مع أمثلة جاهزة.
اقرأ المزيد