زمان Unix و نگارش ISO 8601
یکای بیرون از SI · کمیت: یک لحظهٔ زمانی همچون عدد صحیح ثانیه از 1970
در نوزدهم ژانویهٔ 2038، ساعت سه و چهارده دقیقه و هفت ثانیه به وقت جهانی، شمارندهای از ثانیهها به پهنای سیودو بیت به 2 147 483 647 میرسد — بزرگترین عددی که توان در بر گرفتنش را دارد. تپش بعدی بیت بالایی را برمیافرازد و همان واژهٔ دودویی از این پس منفی خوانده میشود: ساعتهایی که زمان را درست با همین شمارش نگه میدارند نه در 2038، که در دسامبر 1901 خواهند بود. این شگفتی آیندهای دور نیست — یک کنترلگر صنعتی یا کنتور آب بیش از آن دوازده سالی که مانده خدمت میکند.
شمارش به نهایت ساده ساخته شده است: ثانیهها پشت سر هم از نیمهشب یکم ژانویهٔ 1970 میروند، و روز در آن همیشه دقیقاً 86 400 ثانیه دارد. همین سادگی سرچشمهٔ هر دو ویژگی آن است. از یک سو، از عدد بیدرنگ تاریخ تقویمی برمیآید و برعکس، چنانکه هر گزارش رویدادها، هر پایگاه داده و هر سامانهٔ پرونده زمان را با آن نگه میدارد. از سوی دیگر، ثانیهٔ کبیسه را در چنین شمارشی بههیچروی نمیتوان بیان کرد، یعنی برخلاف نامش نه ثانیهها را شماره میزند بلکه روزها را با کسرهایشان، و در حقیقت تابعی خطی از نگارش UTC است، نه شمارندهای از زمان گذشته.
01 · تعریف
زمان Unix شمار ثانیههایی است که از نیمهشب یکم ژانویهٔ 1970 به وقت جهانی هماهنگ گذشته است، به این شرط که هر روز دقیقاً 86 400 ثانیه داشته باشد. نگارش ISO 8601 همان را جور دیگری میگوید: با تاریخ تقویمی، وقت روز و نشان دادن اختلاف از نصفالنهار مبدأ، و میدانها بهسختی از درشت به ریز میروند.
شرط 86 400 ثانیه ریزهکاری نیست، بلکه بنیادیترین چیز در تعریف است. ثانیهٔ کبیسه را، که سازمان چرخش زمین اعلام میکند، شمارش نمیتواند در خود جای دهد، و از این رو در لحظهٔ درج، سامانه یا یک مقدار واحد را دو بار تکرار میکند یا ساعت را عقب میبرد. از این چیز مهمی برمیآید: تفاضل دو عدد unix شمار ثانیههایی نیست که میان دو رویداد بهراستی گذشته، اگر میانشان کبیسهای افتاده باشد — واگرایی از مقیاس اتمی هماکنون به بیستوهفت ثانیه رسیده است.
اما مرز نه به تعریف که به پهنای نگهداری بستگی دارد. سیودو بیت با علامت بزرگترین مقدار 2 147 483 647 را میدهد که در نوزدهم ژانویهٔ 2038 میافتد؛ افزایش بعدی بیت بالایی را یک میکند و عدد را منفی میسازد و ساعت را به سیزدهم دسامبر 1901 پرتاب میکند. شصتوچهار بیت مرز را دویستونودودو میلیارد سال به جلو میراند، اما میلیاردمهای صحیح در همان شصتوچهار بیت همین 2262 به پایان میرسند.
نگارش بر پایهٔ استاندارد کار دیگری را حل میکند — تبادل را، نه نگهداری را — و از این رو در آن چیزهایی وزن دارند که عدد اصلاً ندارد: اختلاف ساعت، جداکننده میان تاریخ و وقت، و این قاعده که در برابری طول رشته، ترتیب الفبایی با ترتیب زمانی میخواند. همین ویژگی واپسین بود که قالب را پایهٔ چیدن در نام پروندهها و در گزارشها کرد.
زمان را با لغزنده ببرید و ببینید ثبات چگونه پر میشود: بیتها از راست به چپ روشن میشوند، و تا زمانی که بالایی، بیت علامت، تاریک بماند عدد مثبت است و تاریخ میبالد. همین که شمارنده از 2 147 483 647 بگذرد، بیت بالایی سرخ برمیافروزد، همهٔ عدد منفی میشود و ساعت به 1901 میجهد.
خط سبز راست مقیاس اتمی است، جایی که هر ثانیه بهراستی ثانیه است. خط سرخ پلکانی زمان Unix است، که در هر درج یک مهر واحد را دو بار میدهد، و از این رو خط در جای خود میایستد. واگرایی هماکنون بیستوهفت ثانیه است و میبالد، و از این رو شمارش برای تاریخ تقویمی به کار میآید، نه برای اندازهگیری مدتها در فیزیک.
02 · تبدیل
مهر زمانی یا تاریخ را وارد کنید
میان همهٔ مضربهای شمارش — ثانیه، هزارم، میلیونم و میلیاردم — تبدیلها دقیقاند، چون تنها به یک ضریب فرق دارند. تقریبی یک سطر است و بس: تبدیل به مقیاس اتمی نیازمند دانستن این است که تا لحظهٔ دادهشده چند ثانیهٔ کبیسه گرد آمده.
تحلیل رشته بر پایهٔ استاندارد را برگه در نگارش گسترده با حرف Z انجام میدهد؛ شکل پایه بدون جداکننده به تنظیمهای ریز برده شده است.
مسئلهٔ سال 2038 در استاندارد نیست، در سختافزار و در کد کهنه است: مهرهای سیودو بیتی در نرمافزار کنتورها، در کنترلگرهای صنعتی، در قالبهای سامانهٔ پرونده و در پایگاههای داده نشستهاند، آنجا که میدان پیشتر چهاربایتی اعلام شده. تغییر نوع در متن برنامه بهقدر کافی آسان است؛ اما گذر از میلیونها دستگاه نصبشده در دوازده سال باقیمانده کاری است از همان گونه که پیش از سال 2000 در پیش بود.
| مقدار | یادداشت | ||
|---|---|---|---|
| {u} | {name} | {value} | {note} |
03 · مرتبههای بزرگی
مقیاس لگاریتمی: از ثانیه تا مرز شصتوچهار بیت04 · ابزارهای اندازهگیری
با چه چیز بر رویداد مهر زمانی میزنند
تراشهای جداگانه با باتری که تا دستگاه خاموش است شمارش را نگه میدارد. معمولاً نه مهر unix که میدانهای تقویم را جداگانه نگه میدارد، و پهنای میدان سالش از آنِ خودش است، چنانکه در بردهای کهنه سخن از 2038 با این پرسش آغاز میشود که خود تراشه تا کدام سال میشمارد.
پروتکل NTP ساعت ماشین را با دقت چند هزارم ثانیه به زمان مشترک میرساند، و خودش نیز با پرچمی ویژه یک روز پیشتر از درج هشدار میدهد. مرز خودش را هم دارد، و آن زودتر میرسد: شمارش از 1900 در سیودو بیت بیعلامت میرود و در فوریهٔ 2036 سرریز میکند.
در گزارش مهر را یا با عدد مینویسند یا با رشته بر پایهٔ استاندارد، و دومی درست به یک دلیل بهتر است: در رشتههای همطول، ترتیب الفبایی با ترتیب زمانی میخواند، چنانکه مدخلها بدون تحلیل تاریخ چیده میشوند. درست از همین رو قالب بسیار فراتر از فن رایانه گسترده شد.
آمادگی دستگاه برای 2038 را تنها به یک راه میتوان آزمود — ساعتش را فراتر از مرز شوم بردن و دیدن که بر سر گزارشها، گواهیها و محاسبهٔ بازهها چه میآید. به این شیوه پیشتر خرابیهایی در صورتحساب، در سامانههای کنترل ورود و در مدت اعتبار کلیدها یافته شده، آنجا که تاریخ آینده با جمع ساخته میشود و مدتها پیش از خود مرز سرریز میکند.
05 · قواعد نگارش
از درشت به ریز، و همیشه با اختلاف ساعت
استاندارد ترتیب کاهشی میدانها، چهار رقم سال، خط تیره را همچون جداکنندهٔ تاریخ و حرف T را پیش از وقت میخواهد؛ اختلاف ساعت یا با حرف Z برای نصفالنهار مبدأ نشان داده میشود یا همچون بهعلاوه و منهای ساعت و دقیقه. مهر unix با عدد صحیح و بدون جداکردن مرتبهها نوشته میشود، و مضرب را همیشه باید روشن کرد، چون ضریب هزار ثانیهها را از هزارمها جدا میکند و از روی بزرگی عدد این دو بهآسانی اشتباه میشوند.
نگارش نخست در کشورهای گوناگون جور دیگری خوانده میشود و از این رو در تبادل داده روا نیست. دومی هم جداکننده و هم اختلاف ساعت را میاندازد، چنانکه لحظه به اندازهٔ یک روز به هر دو سو نامعین میماند. سومی صفرهای آغازین را از دست میدهد و رشتهها دیگر الفبایی چیده نمیشوند — و درست به خاطر همین ویژگی است که قالب ارج دارد. چهارمی میان شمارش unix و مقیاس اتمی نشان برابری میگذارد، حال آنکه میان آن دو بیستوهفت ثانیه درج انباشته خوابیده است.
06 · یکاهای همسایه
در کنارش همهٔ شمارشهایی ایستادهاند که بر همان اصل ساخته شدهاند، اما از آغازی دیگر: زمان NTP از 1900، تاریخ ژولیانی از نیمروز سال 4713 پیش از عصر ما، مقیاس سامانهٔ ماهوارهای از ژانویهٔ 1980. تنها به مبدأ و یکا فرق دارند و از این رو با کم کردن یک ثابت تبدیل میشوند.
ثانیههای علامتدار
مرزش همین 2036 میافتد
کبیسهها صادقانه شمرده شده
از شناسنامههای Simetrium در کنار آناند تاریخ ژولیانی، که ثابت تبدیل از آن گرفته شده، مقیاسهای UTC و TAI و UT1، که کبیسههای گمشده را توضیح میدهند، ثانیه همچون یکای شمارش، و بیت، که پهنایش مرز را تعیین میکند.
07 · بخش تاریخی
مبدأیی که از کمبود بیت برگزیده شد
در نخستین راهنمای Unix زمان به شصتمهای ثانیه از آغاز 1971 شمرده میشد، و در سیودو بیت چنین شمارشی تنها دو سالی جای میگرفت. چنان زود به پایان میرسیدند که مبدأ را باید در هر انتشار سامانه جابهجا میکردند، و از کسرهای ثانیه به سود ثانیههای صحیح دست کشیدند.
با گذر به ثانیههای صحیح، سازندگان ذخیرهای صدوسیوشش ساله به دست آوردند و توانستند آغاز را به آسانی برگزینند نه از ناچاری. یکم ژانویهٔ 1970 را گرفتند — نزدیکترین تاریخ رُند در گذشته، که نوشتههای ماشین به هر روی به آن نمیرسید — و از آن پس حتی یک بار هم عوضش نکردند، هرچند سامانه بیش از یک بار از بن بازنویسی شد.
سازمان بینالمللی استانداردسازی قالبهای ملیِ واگرا را به یکی رساند و قاعدهای ساده را بنیاد آن نهاد: میدانها از درشت به ریز میروند، همه با صفرهای آغازین. اثر جانبی از خودِ قصد مهمتر از آب درآمد — چنین رشتههایی همچون عدد چیده میشوند، و قالب در نام پروندهها، گزارشها و پروتکلهای تبادل گسترده شد.
سامانههای رومیزی و کارساز دیرزمانی است به شصتوچهار بیت گذشتهاند، و آنجا مرز فراتر از هر افق خردمندانه رانده شده. خطر جای دیگری مانده است: در نرمافزار دستگاههایی با بیست سال عمر، در قالبهای پرونده که میدان چهاربایتی اعلام شده، و در محاسبهٔ مهلتهای آینده که همین امروز سرریز میکنند، همین که به تاریخ کنونی پانزده سال بیفزایی.
شمارشی که برخلاف نامش ثانیه نمیشمارد
تعریف زمان Unix چون شمارش ثانیه به گوش میآید، اما شرط 86 400 ثانیهٔ رُند در روز چیز دیگری از آن میسازد: تابعی خطی از نگارش UTC، نه اندازهای از زمان گذشته. هر بار که سازمان چرخش زمین درجی اعلام میکند، شمارش باید یک مقدار واحد را دو بار تکرار کند یا به عقب بجهد، و از تفاضل دو مهر درست همان ثانیه گم میشود. در نیم قرن بیستوهفت چنین از دست رفتنی گرد آمده، و از این رو در کارهایی که مدت راستین میخواهند مقیاس اتمی را میگیرند نه این را.
ویژگی دوم اصلاً در تعریف نیست، در شیوهٔ نگهداری است، و همین آن را تنها مرزی در فهرست ما میکند که نه طبیعت نهاده و نه توافق، بلکه پهنای واژهٔ ماشین. تاریخ ژولیانی هرگز به پایان نمیرسد، چون عدد است؛ زمان Unix در نوزدهم ژانویهٔ 2038 به پایان میرسد، چون میدانی چهاربایتی است. تفاوت میان یک کمیت و نمایش آن معمولاً اندازهشناسان را کم مشغول میدارد، و اینجا درست همان است که همه چیز را تعیین میکند.
فهرست · یکاهای اندازهگیری
شناسنامهای برای هر کمیت
هفت یکای پایهٔ SI، بیست و دو یکای برآمده با نام ویژهٔ خود، و کمیتهای بیرون از دستگاه که بی آنها نه فن کار میکند نه گاهشمار.