المفاهيم الخاطئة للمبرمجين حول وقت يونكس

أعتذر لباتريك ماكنزي .

استفسر داني بالأمس عن حقائق غريبة حول وقت يونكس ، وذكّرت أنه يعمل أحيانًا بشكل غير مقصود.

هذه الحقائق الثلاث تبدو معقولة للغاية ومنطقية ، أليس كذلك؟

  1. وقت Unix هو عدد الثواني منذ 1 يناير 1970 ، 00:00:00 UTC.
  2. إذا انتظرت ثانية واحدة بالضبط ، فسيتغير وقت يونكس ثانية واحدة بالضبط.
  3. وقت يونكس لا ينتقل أبدًا إلى الوراء.

كل هذا غير صحيح.

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


ساعة الطاولة من سبعينيات القرن السابع عشر. جمعها جون ليروكس. من مجموعة ويلكوم . نشرت تحت CC BY

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

يتم تحديد وقت UTC حسب عاملين:

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

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

عندما ينفد التزامن مرتين ، تتم إضافة ثانية أو إزالتها في UTC لاستعادة التزامن. منذ عام 1972 ، أضافت خدمة IERS (التي تدير هذه الحالة) 27 ثانية إضافية. كانت النتيجة 27 يومًا من التوقيت العالمي المنسق دائمًا 86،401 ثانية. من الناحية النظرية ، فإن ظهور يوم يدوم 86 399 ثانية (ناقص واحد) أمر ممكن. يتناقض كلا الخيارين مع الافتراض الأساسي لوقت يونكس.

يفترض وقت يونكس أن كل يوم يدوم 86،400 ثانية بالضبط (60 × 60 × 24 = 86،400) ، دون أي ثوانٍ إضافية. في حالة حدوث مثل هذه القفزة ، فإن وقت يونكس إما يقفز بعد ثانية ، أو عن طريق حساب ثانيتين في ثانية واحدة. اعتبارا من عام 2019 ، فإنه مفقود 27 ثانية قفزة.

لذلك يجب أن تكمل أخطائنا على النحو التالي:

  • وقت يونكس هو عدد الثواني منذ 1 يناير 1970 00:00:00 UTC ناقص الثواني الكبيسة .
  • إذا انتظرت ثانية واحدة بالضبط ، فسيتغير وقت يونكس ثانية واحدة بالضبط إذا لم يتم حذف الثانية الإضافية .

    حتى الآن ، في الممارسة العملية ، لم تتم إزالة الثواني أبدًا (والتباطؤ في دوران الأرض يعني أن هذا غير مرجح) ، ولكن إذا حدث ذلك ، فهذا يعني أن يوم UTC كان أقصر من ثانية واحدة. في هذه الحالة ، يتم تجاهل الثانية الأخيرة من UTC (23:59:59).

    يشتمل كل يوم من أيام Unix على نفس عدد الثواني ، لذلك لن يتوافق آخر يوم من أيام Unix مع أي وقت UTC. إليك ما يبدو عليه في فترات الربع الثاني:



    إذا بدأت الساعة 23: 59: 58: 00 بالتوقيت العالمي وانتظر ثانية واحدة ، فإن وقت يونكس سوف يتقدم لثواني بالتوقيت العالمي المتفق عليه ، ولن يتم تخصيص الطابع الزمني لليونيكس 101 لأي ​​شخص.
  • لا يمكن أن يعود وقت يونكس إلى أن تتم إضافة ثانية إضافية .

    لقد حدث هذا بالفعل 27 مرة في الممارسة. في نهاية اليوم ، أضف UTC ثانيةً 23:59:60. أيام Unix لها نفس عدد الثواني ، لذلك لا يمكنها إضافة ثانية إضافية - بدلاً من ذلك ، يجب عليك تكرار الطوابع الزمنية لـ Unix للثانية الأخيرة. إليك ما يبدو عليه في فترات الربع الثاني:



    إذا بدأت الساعة 23: 59: 60.50 وانتظرت نصف ثانية ، فسوف يعود وقت يونكس لنصف ثانية ، بينما يتوافق الطابع الزمني الخاص بـ Unix 101 مع ثانيتين بالتوقيت العالمي المنسق.

ربما لا تكون هذه هي الشذوذات الوحيدة في وقت يونكس - فقط ما تذكرته بالأمس.

الوقت شيء غريب جدا .

Source: https://habr.com/ru/post/ar452584/


All Articles