شرح الطوابع الزمنية في Unix
الطابع الزمني في Unix مجرد عدد من الثواني، ومع ذلك يسبب سيلًا ثابتًا من الأخطاء. ما الذي يعدّه، وكيف تميز الثواني من الميلي ثانية بنظرة، وما الذي يحدث مع المناطق الزمنية والثواني الكبيسة، ولماذا يهم عام 2038.
افتح تقريبًا أي ملف سجل أو تصدير قاعدة بيانات أو استجابة واجهة برمجية وستجد أرقامًا مثل 1791288000 حيث يجب أن يكون التاريخ. هذا الرقم طابع زمني في Unix، وهو أكثر طريقة شيوعًا تخزن بها الحواسيب لحظة من الزمن. يشرح هذا الدليل ما يعنيه الرقم، وكيف تعرف وحدته بنظرة، وأين تدخل المناطق الزمنية، ولماذا يهم عام 2038.
ما يعنيه الرقم
الطابع الزمني في Unix هو عدد الثواني التي مرت منذ 1 يناير 1970، 00:00:00 UTC، وهي لحظة تُعرف بحقبة Unix. اختيار التاريخ تاريخي: كان رقمًا مستديرًا ملائمًا حين كان نظام التشغيل Unix يُكتب في مختبرات Bell نحو 1970.
جاذبيته في بساطته. عدد صحيح واحد سهل التخزين والفرز والمقارنة، ويمكن طرح لحظتين للحصول على مدة بالثواني، والرقم نفسه يعني اللحظة نفسها في كل أنحاء العالم. بعض المعالم تساعد على الإحساس بالمقياس:
| الطابع الزمني | اللحظة (UTC) |
|---|---|
0 | 1 يناير 1970، 00:00:00 |
-1 | 31 ديسمبر 1969، 23:59:59 |
1000000000 | 9 سبتمبر 2001، 01:46:40 |
1234567890 | 13 فبراير 2009، 23:31:30 |
1700000000 | 14 نوفمبر 2023، 22:13:20 |
2000000000 | 18 مايو 2033، 03:33:20 |
2147483647 | 19 يناير 2038، 03:14:07 |
الأرقام السالبة مسموحة وتعدّ إلى الوراء، فتعمل التواريخ قبل 1970 أيضًا، ما دام البرنامج الذي يقرؤها يتوقع ذلك.
ثوانٍ أم ميلي ثانية أم أكثر؟
التعريف الأصلي يستخدم الثواني، لكن أنظمة كثيرة تعدّ وحدات أدق من الحقبة نفسها. Date.now() في JavaScript وSystem.currentTimeMillis() في Java ومعظم واجهات الويب البرمجية تستخدم الميلي ثانية. وقواعد البيانات وأدوات التتبع تستخدم أحيانًا الميكروثانية أو النانوثانية.
لتواريخ عصرنا، يكشف عدد الخانات الوحدة:
- 10 خانات: ثوانٍ (يبقى هذا صحيحًا حتى عام 2286).
- 13 خانة: ميلي ثانية.
- 16 خانة: ميكروثانية.
- 19 خانة: نانوثانية.
الخلط بينها من أكثر أخطاء التواريخ شيوعًا. قيمة بالثواني تُقرأ كميلي ثانية تقع في يناير 1970؛ وقيمة بالميلي ثانية تُقرأ كثوانٍ تقع بعد عشرات آلاف السنين. إن ظهر تاريخ في تطبيقك كعام 1970، فأول ما تفحصه عامل 1,000 مفقود. محوّل الطابع الزمني لدينا يكتشف الوحدة من عدد الخانات، ويمكنك تجاوز ذلك.
المناطق الزمنية: الطابع الزمني ليس له منطقة
الطابع الزمني يحدد لحظة، لا قراءة ساعة حائط. القيمة 1791288000 هي اللحظة نفسها في طوكيو وباريس ونيويورك؛ وما يختلف هو الوقت المحلي فقط. وتحويلها إلى تاريخ مقروء يتضمن دائمًا اختيار منطقة زمنية، ومعظم الأخطاء تحدث في تلك الخطوة.
النمط المعتاد هو تخزين الطوابع الزمنية وإرسالها بتوقيت UTC وتحويلها إلى الوقت المحلي فقط حين تُعرض على شخص. وحين تحوّل تاريخًا محليًا إلى طابع زمني، يجب أن تعرف المنطقة الزمنية التي كان فيها ذلك التاريخ. «9 مارس 2025، 09:00» طابع زمني مختلف في برلين عنه في شيكاغو، وحول تغييرات التوقيت الصيفي قد يوجد الوقت المحلي مرتين أو لا يوجد إطلاقًا.
الثواني الكبيسة تُتجاهل
دوران الأرض غير منتظم قليلًا، فأضاف التوقيت العالمي الرسمي UTC أحيانًا ثانية كبيسة، 27 منها بين 1972 و2016. وتتظاهر Unix بأنها غير موجودة: كل يوم 86,400 ثانية بالضبط. وأثناء الثانية الكبيسة تكرر ساعة Unix ثانية أو تنشرها.
لكل غرض تقريبًا هذه ميزة. فهي تعني أن الطابع الزمني لأي تاريخ يُحسب بحساب بسيط، وأن طرح طابعين زمنيين يعطي الفرق بثواني التقويم. وحدها التطبيقات التي تحتاج قياس فترات فيزيائية بدقة الثانية عبر ثانية كبيسة، كبعض الأنظمة العلمية، يجب أن تهتم. وقد صوتت هيئات ضبط الوقت الدولية على التوقف عن إضافة الثواني الكبيسة بحلول 2035.
مشكلة عام 2038
كثير من الأنظمة القديمة تخزن الطابع الزمني في عدد صحيح موقّع من 32 بت. أكبر قيمة يتسع لها 2,147,483,647، وهي 19 يناير 2038 عند 03:14:07 UTC. وبعد ثانية واحدة يفيض الرقم ويلتف إلى القيمة السالبة القصوى، التي تقرؤها تلك الأنظمة كـ13 ديسمبر 1901.
إنها من نوع مشكلة عام 2000 نفسه، وتُصلح بالطريقة نفسها: بالانتقال إلى أرقام أعرض. الطابع الزمني الموقّع من 64 بت يدوم نحو 292 مليار سنة. أنظمة التشغيل وقواعد البيانات واللغات الحديثة تستخدم الوقت بـ64 بت أصلًا، لكن الأجهزة المدمجة وصيغ الملفات القديمة وبعض قواعد البيانات ذات أعمدة الطوابع الزمنية بـ32 بت ستحتاج تحديثات قبل 2038. وإن صممت صيغة ملف أو عمود قاعدة بيانات اليوم، فاجعله 64 بت.
عدد موقّع من 64 بت من الثواني يدوم نحو 292 مليار سنة، بعيدًا جدًا خارج هذا المقياس.
التحويل يدويًا وفي الشيفرة
في معظم اللغات التحويل سطر واحد. بعض الأمثلة:
// JavaScript: seconds to a Date, and back
new Date(1791288000 * 1000).toISOString(); // "2026-10-06T12:00:00.000Z"
Math.floor(Date.now() / 1000); // the current timestamp in seconds
# Python
from datetime import datetime, timezone
datetime.fromtimestamp(1791288000, tz=timezone.utc)
-- PostgreSQL
SELECT to_timestamp(1791288000);جداول البيانات تعدّ الأيام بدل الثواني، من حقبتها الخاصة. في Excel وGoogle Sheets يصبح الطابع الزمني في الخلية A1 تاريخًا بالصيغة =A1/86400+25569 (ثم نسّق الخلية كتاريخ)، لأن 25,569 هو عدد الأيام بين 1 يناير 1900 و1 يناير 1970 في تقويم Excel.
للفحوص السريعة، يعرض محوّل الطابع الزمني الطابع الزمني الحالي مباشرة، ويحوّل أي طابع زمني إلى تاريخ في المنطقة الزمنية التي تختارها (مع اكتشاف الوحدة لك)، ويعمل في الاتجاه المعاكس من تاريخ، ويقيس الفرق بين تاريخين. يعمل في متصفحك، فتبقى القيم التي تلصقها على جهازك.
أسئلة وأجوبة
لماذا يظهر تاريخي 1 يناير 1970؟
قرأ البرنامج قيمة صفر، أو طابعًا زمنيًا بالثواني كميلي ثانية. افحص الحقل الفارغ والضرب أو القسمة المفقودة على 1,000.
هل الطابع الزمني في Unix بتوقيت UTC؟
يعدّ من لحظة معرّفة بتوقيت UTC، ويصف اللحظة نفسها في كل مكان، فعمليًا نعم. لا يصبح وقتًا محليًا إلا حين تحوّله للعرض.
هل سيتوقف حاسوبي عن العمل في 2038؟
أنظمة تشغيل الحواسيب والهواتف الحالية تستخدم الوقت بـ64 بت ولا تتأثر. الخطر في الأجهزة المدمجة القديمة والبرامج الموروثة وصيغ البيانات التي ما زالت تخزن طوابع زمنية بـ32 بت.
كيف أحصل على الطابع الزمني الحالي في Unix؟
في طرفية على macOS أو Linux، شغّل date +%s. وفي JavaScript استخدم Math.floor(Date.now() / 1000). ويعرضه محوّل الطابع الزمني أيضًا مباشرة.
الأدوات في هذا المقال
المزيد من المدونة
ZIP أم 7z أم RAR: أي صيغة أرشيف هي الأفضل؟
حزمنا المجلدات نفسها من الصور والفيديو والمستندات والبيانات في أرشيفات ZIP و7z وRAR وقسنا الحجم والسرعة. الفائز يتوقف كليًا تقريبًا على ما في الداخل.
CSV أم Excel أم JSON: أي صيغة لبياناتك؟
حفظنا الجدول نفسه ذا 100,000 صف بصيغة CSV وكمصنف Excel وبصيغة JSON، ثم قارنا الأحجام وسرعة قراءة كل منها في الشيفرة وما يحدث من أخطاء مع التواريخ والأصفار البادئة والأرقام الطويلة.
تصحيح الأخطاء وحجم رمز QR: اختبار L وM وQ وH
تصحيح الأخطاء الأعلى يجعل رمز QR يصمد أمام التلف، لكنه يجعله أكثف أيضًا. أنشأنا رموزًا لأربعة أنواع شائعة من المحتوى بكل مستوى وغطيناها شيئًا فشيئًا حتى توقفت قراءتها.