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

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

Вчера داني سألت عن بعض الحقائق المثيرة للاهتمام حول وقت يونكس، وتذكرت أنه في بعض الأحيان يعمل بشكل غير بديهي تماما.

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

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

لا شيء من هذا صحيح.

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

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

جميع المفاهيم الخاطئة الثلاثة لها سبب واحد: ثواني كبيسة. إذا لم تكن على دراية بالثواني الكبيسة، فإليك مرجع سريع:

يتم تحديد التوقيت العالمي المنسق (UTC) من خلال عاملين:

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

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

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

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

لذلك يجب استكمال مفاهيمنا الخاطئة بما يلي:

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

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

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

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

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

  • زمن يونكس لا يمكن أن يعود إلى الوراء أبداً، حتى تتم إضافة ثانية كبيسة.

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

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

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

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

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

المصدر: www.habr.com

إضافة تعليق