تصورات غلط برنامه نویسان درباره Unix Time

معذرت می خواهم پاتریک مک کنزی.

دیروز دنی من در مورد برخی از حقایق جالب در مورد زمان یونیکس پرسیدم، و به یاد آوردم که گاهی اوقات کاملاً غیر مستقیم کار می کند.

این سه واقعیت بسیار معقول و منطقی به نظر می رسند، اینطور نیست؟

  1. زمان یونیکس تعداد ثانیه‌هایی است که از 1 ژانویه 1970 ساعت 00:00:00 UTC شروع شده است.
  2. اگر دقیقاً یک ثانیه صبر کنید، زمان یونیکس دقیقاً یک ثانیه تغییر می کند.
  3. زمان یونیکس هرگز به عقب حرکت نمی کند.

هیچ کدام از اینها درست نیست.

اما تنها گفتن «هیچکدام از اینها درست نیست» بدون توضیح کافی نیست. چرا. برای توضیحات زیر را ببینید. اما اگر می خواهید خودتان فکر کنید، از عکس ساعت عبور نکنید!

تصورات غلط برنامه نویسان درباره Unix Time
ساعت رومیزی از دهه 1770. گردآوری شده توسط جان لروکس. از جانب مجموعه های خوش آمدید. تحت مجوز منتشر شده است CC BY

هر سه تصور غلط یک دلیل دارند: ثانیه های کبیسه. اگر با ثانیه های کبیسه آشنا نیستید، در اینجا یک مرجع سریع وجود دارد:

زمان UTC توسط دو عامل تعیین می شود:

  • زمان بین المللی اتمی: میانگین قرائت از صدها ساعت اتمی در سراسر جهان. ما می‌توانیم دومی را با خواص الکترومغناطیسی یک اتم اندازه‌گیری کنیم، و این دقیق‌ترین اندازه‌گیری زمان است که علم می‌داند.
  • ساعت جهانی، بر اساس چرخش زمین به دور محور خود است. یک انقلاب کامل یک روز است.

مشکل این است که این دو عدد همیشه با هم مطابقت ندارند. چرخش زمین ثابت نیست - به تدریج سرعت آن کاهش می یابد، بنابراین روزها در زمان جهانی طولانی تر می شوند. از سوی دیگر، ساعت‌های اتمی به طرز شیطانی دقیق و در طول میلیون‌ها سال ثابت هستند.

هنگامی که دو بار از همگام سازی خارج می شوند، یک ثانیه از UTC اضافه یا حذف می شود تا دوباره به همگام شوند. از سال 1972 خدمات IERS (که این مورد را اجرا می کند) 27 ثانیه اضافی اضافه کرد. نتیجه 27 روز UTC با مدت زمان 86 ثانیه بود. از نظر تئوری، یک روز با مدت زمان 401 ثانیه (منهای یک) امکان پذیر است. هر دو گزینه با فرض اساسی زمان یونیکس در تضاد هستند.

زمان یونیکس فرض می‌کند که هر روز دقیقاً 86 ثانیه (400 × 60 × 60 = 24) بدون هیچ ثانیه اضافی طول می‌کشد. اگر چنین پرشی رخ دهد، زمان یونیکس یا یک ثانیه پرش می کند یا دو ثانیه در یک ثانیه شمارش می کند. از سال 86، 400 ثانیه کبیسه را از دست داده است.

بنابراین باورهای غلط ما باید به شرح زیر تکمیل شود:

  • زمان یونیکس تعداد ثانیه هایی است که از اول ژانویه 1 تا کنون 1970:00:00 UTC منهای ثانیه های کبیسه.
  • اگر دقیقاً یک ثانیه صبر کنید، زمان یونیکس دقیقاً یک ثانیه تغییر می کند. مگر اینکه ثانیه کبیسه حذف شده باشد.

    تا به حال، ثانیه ها هرگز در عمل حذف نشده اند (و کند شدن چرخش زمین به این معنی است که این امر بعید است)، اما اگر این اتفاق بیفتد، به این معنی است که روز UTC یک ثانیه کوتاهتر می شود. در این حالت، آخرین ثانیه UTC (23:59:59) کنار گذاشته می‌شود.

    هر روز یونیکس دارای همان تعداد ثانیه است، بنابراین آخرین ثانیه یونیکس از یک روز کوتاه شده با هیچ زمان UTC مطابقت نخواهد داشت. در فواصل ربع ثانیه به نظر می رسد:

    تصورات غلط برنامه نویسان درباره Unix Time

    اگر از ساعت 23:59:58:00 UTC شروع کنید و یک ثانیه صبر کنید، زمان یونیکس دو ثانیه UTC جلو می رود و مهر زمانی یونیکس 101 به هیچکس اختصاص داده نمی شود.

  • زمان یونیکس هرگز نمی تواند به عقب برگردد، تا یک ثانیه کبیسه اضافه شود.

    این اتفاق 27 بار در عمل رخ داده است. در پایان روز UTC، یک ثانیه دیگر در ساعت 23:59:60 اضافه می شود. یونیکس همان تعداد ثانیه در روز را دارد، بنابراین نمی تواند یک ثانیه اضافی اضافه کند - در عوض باید مهرهای زمانی یونیکس را برای آخرین ثانیه تکرار کند. در فواصل ربع ثانیه به نظر می رسد:

    تصورات غلط برنامه نویسان درباره Unix Time

    اگر از ساعت 23:59:60.50 شروع کنید و نیم ثانیه صبر کنید، زمان یونیکس است برمی گردد با نیم ثانیه، و مهر زمانی یونیکس 101 معادل دو ثانیه UTC است.

اینها احتمالاً تنها چیزهای عجیب و غریب بارهای یونیکس نیستند - فقط چیزی که دیروز به یاد آوردم.

زمان - بسیار چیز عجیب.

منبع: www.habr.com

اضافه کردن نظر