Epoch के बाद बीता समय
(aphyr.com)- POSIX time/Unix time को अक्सर 1970-01-01 00:00:00 के बाद के सेकंडों की संख्या कहा जाता है, लेकिन असल में यह UTC-आधारित value है जो leap seconds को अनदेखा करती है, इसलिए वास्तविक बीते सेकंडों से मेल नहीं खाती
- 2024-12-25 18:51:26 UTC के आधार पर POSIX time 1735152686 है, जबकि epoch के बाद वास्तविक बीते सेकंड 1735152713 हैं, यानी 27 सेकंड का अंतर
- IEEE 1003.1
seconds since the Epochको परिभाषित करते समय एक दिन को हमेशा 86,400 सेकंड मानकर गणना करता है, और standard का appendix भी compatibility और calculation की सुविधा के लिए 1970 के बाद जोड़े गए 14 leap seconds को अनदेखा करता है - UTC में solar day से अंतर कम करने के लिए leap seconds जोड़े जाते हैं, और इस दौरान POSIX time पीछे jump करता है, जिससे Linux, Qantas, Cloudflare DNS जैसे outage cases हुए हैं
- एक ही computer पर time interval मापने के लिए
CLOCK_MONOTONICयाCLOCK_BOOTTIMEबेहतर हैं, और अगर POSIX timestamp से मिलाना जरूरी हो तो leap smear या POSIX↔TAI conversion पर विचार करना चाहिए
POSIX time वास्तविक बीते सेकंडों की संख्या नहीं है
- JavaScript
Date, GNU coreutils, Linuxtime(2), Gotime.Unix, MySQLdatetime, RubyTime, Cassandratimestampआदि POSIX time को अक्सर Unix epoch के बाद के सेकंडों की संख्या की तरह扱ते हैं - लेकिन यह expression आम intuition से पूरी तरह मेल नहीं खाता
- उदाहरण समय: 2024-12-25 18:51:26 UTC
- POSIX time: 1735152686
- POSIX epoch के बाद वास्तविक बीते सेकंड: 1735152713
- अंतर: 27 सेकंड
- यह अंतर इसलिए पैदा होता है क्योंकि POSIX time IEEE 1003.1 में UTC से derive होने के बावजूद, हर दिन को ठीक 86,400 सेकंड मानता है
- standard में
seconds since the Epochकी definitiontm_sec,tm_min,tm_hour,tm_yday,tm_yearका उपयोग करके value calculate करती है, और 1970 से पहले के years या negative values के साथ relationship को define नहीं करती - वास्तविक दिन की length हमेशा 86,400 सेकंड नहीं होती और समय के साथ बदलती है
- UTC date solar day से बहुत दूर न चली जाए, इसलिए astronomers periodically leap second घोषित करते हैं
- नतीजतन POSIX time हर कुछ साल में पीछे jump कर सकता है
- कभी आगे भी jump कर सकता है
- leap seconds वास्तविक outages का कारण बने हैं
- Linux kernel से जुड़ी leap second समस्या
- Qantas में Linux leap second bug के कारण delays
- Cloudflare DNS पर leap second का असर
standard का compromise और practical alternatives
- IEEE 1003 appendix B बताता है कि standard प्रकाशित होने के समय 1970-01-01 के बाद 14 leap seconds जोड़े जा चुके थे, लेकिन आसान calculation और compatibility के लिए इन 14 seconds को ignore किया गया
- standard मानता है कि ज्यादातर systems में “time” value लगातार बढ़ती है, और उसने यह पक्ष चुना कि leap second के दौरान भी यह value बढ़नी चाहिए
- साथ ही यह मानकर चलता है कि ज्यादातर systems leap seconds track नहीं करते या standard time reference से synchronized नहीं हो सकते
- इसलिए यह requirement नहीं रखता कि
seconds since the Epochreference time और epoch के बीच के exact seconds को अनिवार्य रूप से दर्शाए - उसका रुख यह है कि applications इस value को epoch के बाद seconds की संख्या की तरह treat कर सकें, इतना पर्याप्त है; जरूरी accuracy system vendors और administrators को संभालनी चाहिए
- distributed applications में timestamp से events synchronize किए जाते हैं, इसलिए consistent interpretation महत्वपूर्ण हो सकती है
- leap seconds का accumulation predict नहीं किया जा सकता
- epoch के बाद leap seconds की संख्या बढ़ने की संभावना है
- standard को astronomically short duration वाली applications के बीच time synchronization में ज्यादा रुचि है
- वास्तविक systems समय थोड़ा mismatch होने पर भी आम तौर पर काम करते हैं, लेकिन leap seconds दुर्लभ हैं और “epoch के बाद seconds की संख्या” वाली linear intuition मजबूत है, इसलिए undiscovered bugs जमा हो सकते हैं
- स्थिति के हिसाब से alternatives ये हैं
- एक computer पर दो events के बीच केवल duration calculate करनी हो तो
CLOCK_MONOTONIC, और उससे भी आगेCLOCK_BOOTTIMEइस्तेमाल करें - अगर POSIX time मानने वाले दूसरे systems के साथ timestamp exchange करने की जरूरत नहीं है, तो TAI, GPS, LORAN इस्तेमाल करें
- POSIX timestamp systems से roughly align करना हो तो leap smear के जरिए leap second को लंबे time interval में distribute करें
- qntm की t-a-i जैसी library से POSIX और TAI के बीच conversion संभव है
- एक computer पर दो events के बीच केवल duration calculate करनी हो तो
- leap seconds को abolish करने की कोशिशें चल रही हैं, और 2035 तक इनके साकार होने की उम्मीद है
एक दिन 86,400 सेकंडassumption पर निर्भर हर चीज में conversion table डालने का अतिरिक्त काम जरूरी होगा- 2035 के बाद के समयों के लिए “दो समयों के बीच कितने seconds हैं” जैसे सवाल काफी सरल हो सकते हैं
1 टिप्पणियां
Hacker News टिप्पणियाँ
मैंने अभी Vernor Vinge का 2000 का SF उपन्यास A Deepness in the Sky पढ़ा, और यह एक शानदार किताब है जिसमें epoch के बाद के सेकंड (seconds since the epoch) का एक अप्रत्याशित ज़िक्र आता है
यह “Traders के समय मापने के तरीके को देखिए…” से शुरू होकर बताता है कि Qeng Ho मानवता द्वारा Old Earth के चाँद पर पहली बार कदम रखने के क्षण से सेकंड गिनते हैं, लेकिन और ध्यान से देखें तो शुरुआती बिंदु असल में लगभग 1.5 करोड़ सेकंड बाद है—मानवता के शुरुआती कंप्यूटर operating systems में से एक का 0 सेकंड
अगर आप “अंतरिक्ष में computer science” और चाहते हैं तो Bobiverse series सुझाऊँगा, और “इंसान + simulation + computer” की और खोज चाहते हैं तो Permutation City
समय मापन के बारे में जब भी पढ़ता हूँ, हर बार कुछ नया सीखता हूँ। मैं सोचता था कि rollover को छोड़ दें तो Unix time समय track करने का सबसे सरल तरीका है, और leap seconds के बारे में जानता था, लेकिन यह नहीं सोचा था कि वे यहाँ भी लागू होते हैं
“UTC, GPS, LORAN and TAI” लिंक भी पढ़ा, और यह दिलचस्प तुलना है कि GPS time leap seconds को reflect नहीं करता
“2035 तक leap seconds हटाने की कोशिश चल रही है” वाली योजना मुझे खास पसंद नहीं है
UTC का मूल उद्देश्य TAI से पूर्णांक सेकंड की दूरी पर रहकर mean solar time (MST) के करीब रहना है। अगर अब MST को track नहीं करना है, तो सीधे TAI पर switch करना चाहिए
UTC को MST से दूर जाने देने पर, पुराने leap seconds फिर भी संभालने पड़ेंगे, लेकिन वे leap seconds अब किसी उद्देश्य के बिना एक अधकचरी स्थिति बन जाएँगे
हालांकि यह प्रस्ताव पूरी तरह अर्थहीन नहीं है। इसका उद्देश्य मौजूदा UTC time management को बदले बिना, 2035 के बाद के दो timestamps के बीच का अंतर ठीक-ठीक वास्तविक physical seconds की संख्या बनाना है
फिर भी, जब MST पहले से ही UTC का एक feature है, तो उसे हटाना अजीब लगता है
लेकिन वास्तविकता में कई systems ने गलत चुनाव किया, और खासकर UNIX सबसे बड़ा कारण है। वह चुनाव इतने सारे systems और regulations में गहराई तक धँस चुका है कि “बस TAI पर switch कर दो” व्यावहारिक रूप से असंभव है
इसलिए UTC को “नया TAI” मानकर reinterpret करना आसान है। किसी दिन पुराना UTC किसी और नाम से फिर सामने आ जाए तो हैरानी नहीं होगी
अधिकतर या सभी देशों में civil time UTC पर आधारित है। सिर्फ इसलिए कि यह थोड़ा अधिक शुद्ध है, दुनिया भर की घड़ियों को करीब 30 सेकंड पीछे नहीं किया जाएगा
GPS time का भी TAI से offset है, लेकिन कोई खास परवाह नहीं करता। Unix epoch भी ऐसा ही है; नतीजा consistent रहे तो काफी है
Leap_Secondनाम की file बना दें। हर महीने देखें कि यह file मौजूद है या नहीं; अगर है तो उसे delete करें,Leap_Secondsfile के value में 1 जोड़ें औरLSSEनाम का backup बना दें“You are not expected to understand this.” यह दोनों systems को बनाए रखने का तरीका है। चाहें तो hash या lookup table से भी बनाया जा सकता है
यह भी महत्वपूर्ण है कि आधुनिक UTC epoch 1 जनवरी 1972 है। उससे पहले UTC, TAI से अलग second length इस्तेमाल करता था
1971 के अंत में intermediate step के तौर पर ठीक 0.107758 TAI seconds का आखिरी irregular jump था, और 1958–1971 के दौरान UTC या TAI के छोटे time steps और frequency adjustments का कुल योग ठीक 10 seconds बने, ऐसा मिलाया गया। इसलिए 1 जनवरी 1972 00:00:00 UTC ठीक 1 जनवरी 1972 00:00:10 TAI था, और उसके बाद से अंतर integer seconds का हो गया
उसी समय UTC की tick rate ठीक TAI जैसी हो गई, और UTC ने UT2 के बजाय UT1 को track करना शुरू किया। इसलिए 1970 और 1971 का Unix time उस अवधि के वास्तविक UTC time से मेल नहीं खाता
https://en.wikipedia.org/wiki/Coordinated_Universal_Time#His...
https://en.wikipedia.org/wiki/Unix_time#UTC_basis
यह मान लेने पर भी कि birth certificate में समय सेकंड तक सटीक है। क्योंकि उनके जीवन के एक हिस्से में “1 सेकंड की लंबाई” मानी गई value, आज हम आम तौर पर जिस 1 सेकंड के बारे में सोचते हैं, उससे काफी अलग थी
यहाँ second से मतलब caesium-133 atom की unperturbed ground-state hyperfine transition frequency 9,192,631,770/s पर आधारित second से है
हाल ही में मैंने किसी exchange के लिए कुछ कोड लिखा था, और वह सिस्टम VAX, या सही कहें तो OpenVMS, पर चलता था और उसका epoch 17 नवंबर 1858 था
अपने करियर में पहली बार मैंने Unix से अलग epoch देखा था, और गनीमत थी कि इस्तेमाल हो रहे कोड में इसे Unix epoch के रूप में abstract कर दिया गया था
https://www.slac.stanford.edu/~rkj/crazytime.txt
1950 के दशक के computer memory में इन तारीखों को फिट करने के लिए calendar को 24 लाख दिनों से offset किया गया, और नतीजतन दिन 0, 17 नवंबर 1858 बन गया
https://www.joelonsoftware.com/2006/06/16/my-first-billg-rev...
macOS/Swift Foundation API
NSDate.timeIntervalSinceReferenceDate1 जनवरी 2001 को epoch के रूप में इस्तेमाल करता हैWikipedia पर एक उपयोगी सूची भी है: https://en.wikipedia.org/wiki/Epoch_(computing)#Notable_epoc...
कुछ समय-बिंदु POSIX timestamp से व्यक्त नहीं किए जा सकते, और कुछ POSIX timestamp वास्तविक समय से मेल नहीं खाते
यह कुछ ऐसा कहने जैसा है कि कुछ time instants के लिए ISO 8601 year नहीं होता। हर instant का year होता है, बस कुछ years दूसरों से लंबे होते हैं
अगर आप बैठकर https://time.is/UTC देखते रहें, तो time monotonically बढ़ेगा, बस कभी-कभी कोई second बहुत थोड़ा लंबा हो जाएगा। जैसे 24 घंटे में करीब 0.001% ज्यादा लंबा
database में date store करते समय हमेशा Unix epoch time के रूप में store करता हूं, और date field में timezone information record नहीं करता। अगर timezone जानने की requirement हो, तो उसे अलग store करता हूं
सोच रहा हूं कि क्या इसके बजाय timestamp को TAI format में store करना चाहिए, और जरूरत पड़ने पर UTC में convert करने वाले function से earth-related corrections handle करने चाहिए
पता है कि timezone एक minefield है, लेकिन वह भी इंसानों की बनाई चीज़ है जिसकी boundaries समय के साथ बदलती रहती हैं। लगता है absolute time पर fix करके जरूरत पड़ने पर desired local time format में render करना चाहिए
leap second adjustment उसी जगह होना चाहिए जहां timezone conversion होता है। दुर्भाग्य से Unix ने गलत चीज़ standardize कर दी, और migration मुश्किल है
इसलिए सारी clocks वैसे भी UTC से synchronized होती हैं। store करते समय UTC से TAI में convert करना और पढ़ते समय वापस convert करना पड़ेगा, जिससे गड़बड़ हो जाएगी
आम तौर पर database में stored timestamp के लिए timezone की कोई concept नहीं होती (SQL Server), या वह “timezone-aware” timestamp type देता है लेकिन input को UTC में convert करके original timezone छोड़ देता है (MySQL, Postgres)
जहां तक मुझे पता है, केवल Oracle ही
with time zonetype में local नहीं बल्कि actual timezone को round-trip preserve कर सकता हैकुछ calculations में 1 second का फर्क बड़ा मुद्दा होता है। सबसे widely used format से अलग कुछ अपनाते समय सावधान रहना चाहिए, और standard से हटने की ठोस वजह होनी चाहिए। सिर्फ अलग होना ही cost बढ़ा सकता है
इस लेख ने तो जैसे Christmas खराब कर दिया। क्या कुछ भी sacred नहीं है? seconds तो epoch के बाद के seconds होने चाहिए
solar day से थोड़ा-सा drift करने की परवाह क्यों करनी चाहिए, समझ नहीं आता। epoch के बाद के seconds को date representation में बदलने वाला converter correction की जिम्मेदारी ले सकता है, है न?
मैं नहीं चाहता कि सारे software leap seconds को hardcode करें, smearing handle करें, और नया leap second introduce होने पर एक महीने के अंदर update method मांगें
अब तक हमें इसकी चिंता या इसके बारे में सोचना नहीं पड़ा, और आगे भी जरूरत नहीं है। इसे सही तरीके से handle किया जा रहा है
leap seconds की जगह equator पर लगाए गए बड़े rockets होने चाहिए। clocks adjust मत करो, planet adjust करो
Islamic tradition में end times और Antichrist (Dajjal) के बारे में कहानियों में भी ऐसी चीज़ सचमुच होने जैसी बात आती है। कहा जाता है, “Antichrist का पहला दिन एक साल जैसा होगा, दूसरा दिन एक महीने जैसा, और तीसरा दिन एक हफ्ते जैसा,” और कई लोग इसे literal रूप में लेते हैं—यानी Earth का rotation सचमुच slow हो जाएगा और आखिर direction reverse हो जाएगी, जिससे सूरज west से उगेगा। वही मानवता के अंत का आखिरी sign होगा
लीप सेकंड की वजह से epoch
date +%sके संकेत से 29 सेकंड और ज़्यादा पहले हो जाए, तो भी इससे क्या फर्क पड़ता है, ऐसा लगता हैयह तथ्य कहीं ज़्यादा महत्वपूर्ण है कि मौजूदा समय को दर्शाने वाले किसी नंबर N पर सभी सहमत हैं। काल्पनिक -29 सेकंड वास्तविक दुनिया पर असर नहीं डालते। हम 30 साल पुराने लक्ष्य पर मिसाइल निशाना लगाने वाला routine तो चलाने वाले नहीं हैं, है न
लीप सेकंड हटाने के पक्ष में हूं, लेकिन समय की असंगति पर ज़ोर देना उपयोगी नहीं लगता। भले ही बारीकी से देखें तो बात सही हो
इससे भी महत्वपूर्ण बात भविष्य पर असर है। पुराने timestamp साधारण “वर्तमान - N सेकंड” calculation से कुछ सेकंड अलग हो सकते हैं, यह ज़्यादातर एक रोचक तथ्य जैसा है; लेकिन भविष्य में किसी समय सभी घड़ियों को फिर 1 सेकंड shift करना पड़ सकता है, यह अधिक महत्वपूर्ण है। इसे ध्यान में रखने के लिए काफी मेहनत मांगने वाले वास्तविक उदाहरण कई हैं