डेवलपर टूल · Unix टाइमस्टैम्प कन्वर्टर
ऑफ-बाय-1000 बग: जब कोई तारीख जनवरी 1970 या वर्ष 56000 दिखाती है
· यह क्यों मायने रखती है
टाइम स्टाम्प्स डिबगिंग डेवलपर-वर्कफ़्लो
जहां मिलीसेकंड की अपेक्षा की जाती है (या इसके विपरीत) वहां सेकंड पास करना सबसे आम टाइमस्टैम्प बग है। यह पोस्ट दिखाती है कि यह प्रत्येक दिशा में कैसा दिखता है, यह भाषाओं के बीच कहाँ छिपता है, और इसे सेकंडों में कैसे पकड़ा जा सकता है।
प्रत्येक उपयोगकर्ता 1 जनवरी 1970 पर शामिल हुआ - वह स्क्रीन जो बग को दूर करती है, और बैकएंड जो बिल्कुल सही था
जनवरी 1970 के निकट प्रत्येक खाते को दर्शाने वाला एक प्रोफ़ाइल पेज एक मजबूत पैमाने का लक्षण है। हो सकता है कि बैकएंड ने सही युग सेकंड लौटाए हों, जबकि फ्रंटएंड कोड ने उन्हें सीधे डेट कंस्ट्रक्टर को भेज दिया हो जो मिलीसेकंड की व्याख्या करता है। वर्तमान समय की गिनती तब कैलेंडर अक्ष पर एक हजार गुना कम हो जाती है।
लगातार वर्ष जोड़कर या तारीख बदलकर डिस्प्ले को पैच न करें। कच्चे फ़ील्ड, उसके API अनुबंध और सटीक कंस्ट्रक्टर कॉल को कैप्चर करें। ToolAcre आपको दोनों इकाइयों को बाध्य करने की सुविधा देता है, ताकि उत्पादन डेटा को बदले बिना एक मान का परीक्षण किया जा सके। किसी अन्य ज्ञात घटना से मेल खाती रीडिंग संभावित सीमा त्रुटि की पहचान करती है।
दो लक्षण - जनवरी 1970 में एक मिलीसेकंड API लैंडिंग को दिए गए सेकंड, और एक सेकंड API लैंडिंग को मिलीसेकेंड दसियों हज़ार साल पहले
सेकंड की व्याख्या मिलीसेकंड के रूप में की जाती है जो युग के करीब है क्योंकि एक अरब मिलीसेकंड एक सदी का केवल एक छोटा सा अंश है। विपरीत गलती एक ट्रिलियन-मिलीसेकंड मान को एक ट्रिलियन सेकंड में विस्तारित करती है, जो अक्सर सामान्य एप्लिकेशन रेंज के बाहर होती है। दोनों विफलताएँ अपने पैमाने को बदलते हुए अंकों को सुरक्षित रखती हैं।
प्रकाशित दस-बनाम-तेरह-अंकीय लेख पहले से ही समकालीन दृश्य अनुमान और उसकी सीमाओं की व्याख्या करता है। यह आलेख इसके बजाय निदान और रोकथाम पर केंद्रित है: स्पष्ट इकाई चयन, स्वतंत्र घटना साक्ष्य, और इंटरफ़ेस पर एक रूपांतरण जहां एक निर्माता का प्रतिनिधित्व उपभोक्ता के अनुबंध से मिलता है।
चूँकि दोनों शाखाएँ नियतात्मक हैं, लक्षण को एक स्थिरता के साथ पुन: प्रस्तुत किया जा सकता है। इससे इकाई बेमेल को आंतरायिक घड़ी बहाव या स्थानीय स्वरूपण व्यवहार की तुलना में साबित करना आसान हो जाता है।
जहां सीमा आम तौर पर होती है - JavaScript और जावा मिलीसेकंड में, Unix टूल, पायथन और अधिकांश डेटाबेस सेकंड में, और उनके बीच JSON पेलोड
यह रिपॉजिटरी साबित करती है कि JavaScript दिनांक मिलीसेकंड की खपत करती है और ToolAcre एक निर्माण से पहले सेकंड को गुणा करती है। यह कार्यपुस्तिका में नामित प्रत्येक जावा, पायथन, शेल या डेटाबेस API के डिफ़ॉल्ट स्थापित नहीं करता है। उन अनुबंधों की जाँच की जानी चाहिए कि उनका उपयोग कहाँ किया जाता है।
JSON नंबर में कोई यूनिट मेटाडेटा नहीं होता है। किसी फ़ील्ड का नामकरण `created_at` करने से सेवाओं में अस्पष्टता स्थानांतरित हो जाती है; इसे `created_at_s` नाम देना या ISO स्ट्रिंग का दस्तावेजीकरण करना अनुबंध को समीक्षा योग्य बनाता है। प्राप्तकर्ता एडॉप्टर को दृश्यों में गुणन को बिखेरने के बजाय एक बार अपने आंतरिक प्रतिनिधित्व में परिवर्तित करना चाहिए।
रूपांतरण को सीमा परिभाषा के बगल में लिखें, पुन: प्रयोज्य डिस्प्ले हेल्पर के अंदर नहीं। एडॉप्टर निर्माता अनुबंध को जानता है; एक सामान्य फ़ॉर्मेटर को पहले से ही सामान्यीकृत इंस्टेंट प्राप्त होना चाहिए।
इकाई सीमा API-विशिष्ट है; यह भंडार साबित करता है JavaScript दिनांक मिलीसेकंड का उपयोग करता है
`0` जैसा कमजोर फिक्स्चर बग का पता नहीं लगा सकता क्योंकि शून्य सेकंड और शून्य मिलीसेकंड दोनों ही युग का नाम देते हैं। छोटे मनगढ़ंत मान भी प्रशंसनीय 1970 तारीखों की तरह दिख सकते हैं। एक मॉक जो अपने उपभोक्ता द्वारा अपेक्षित समान पैमाने पर रिटर्न देता है वह कभी भी वास्तविक एकीकरण बेमेल नहीं होता है।
एक शून्येतर ज्ञात क्षण चुनें और दोनों व्याख्याओं को अवलोकनीय रूप से भिन्न बनाएं। सीमा पर विहित ISO परिणाम का दावा करें, न कि केवल दिनांक ऑब्जेक्ट मौजूद है। एक मिलीसेकंड केस और एक सेकंड केस शामिल करें; ToolAcre के स्वयं के परीक्षण ठीक इसी कारण से प्रत्येक इकाई के अंतर्गत 1,000,000 की तुलना करते हैं।
जब भी परीक्षण दो पैमानों में अंतर करने में विफल होते हैं तो यूनिट बग जीवित रहते हैं
`created_at: 1738578000` पर विचार करें. सेकंड के रूप में बलपूर्वक, यह `2025-02-03T10:20:00.000Z` बन जाता है; मिलीसेकंड के रूप में मजबूर होने पर, यह `1970-01-21T02:56:18.000Z` हो जाता है। फरवरी 2025 में बनाया गया एक परिनियोजन रिकॉर्ड केवल अंकों की गिनती पर भरोसा किए बिना अस्पष्टता को हल करता है।
एडॉप्टर को ठीक करते समय कच्चे JSON को उस ज्ञात घटना के पास रखें। यदि फ़ील्ड `1738578000000` थी, तो मिलीसेकंड व्याख्या उसी क्षण की पहचान करेगी। दो मानों को कभी भी एक स्कीमा के अंदर परस्पर विनिमय के रूप में स्वीकार नहीं किया जाना चाहिए, भले ही एक कन्वर्टर सही पैमाने को लागू करने के बाद उनकी तुल्यता प्रदर्शित कर सकता है।
ज्ञात तैनाती तिथि स्वतंत्र साक्ष्य है। इसके बिना, अधिक प्रशंसनीय आउटपुट का चयन करना निर्माता की मंशा को स्थापित करने के बजाय एक अन्वेषक की अपेक्षा को कूटबद्ध कर सकता है।
कार्यान्वित उदाहरण: दोनों स्पष्ट इकाइयों के अंतर्गत create_at मान का परीक्षण करें
टिकाऊ मरम्मत सीमा पर शुरू होती है: दस्तावेजित स्रोत इकाई को पार्स करें, बिल्कुल एक बार परिवर्तित करें और टाइप किए गए या स्पष्ट रूप से नामित आंतरिक मान को उजागर करें। स्कीमा विवरण, उदाहरण और जेनरेट किए गए क्लाइंट को प्रत्यय या दिनांक-समय प्रारूप को संरक्षित करना चाहिए। एक समीक्षक रनटाइम से पहले एक अतिरिक्त गुणन देख सकता है।
वास्तविक पैमाने और एक निश्चित ISO अपेक्षा के साथ एक प्रतिगमन स्थिरता जोड़ें। जब निर्माता के पास अनुबंध हो तो एप्लिकेशन कोड में ऑटो-डिटेक्शन से बचें; अनुमान अनिश्चित विरासत डेटा की जांच के लिए हैं। ToolAcre अपनी खोजी गई पसंद को सटीक रूप से लेबल करता है ताकि अनुमान गारंटीकृत मेटाडेटा के रूप में सामने न आ सके।
इसमें क्या शामिल नहीं है - समय क्षेत्र की गलतियाँ, जो किसी तारीख को दशकों के बजाय घंटों के हिसाब से बदल देती हैं
समय-क्षेत्र त्रुटि आम तौर पर प्रदर्शन को घंटों के हिसाब से बदल देती है और एक कैलेंडर दिन पार कर सकती है। 1,000 त्रुटि का एक कारक दशकों या सहस्राब्दियों को बदल देता है। निदानों को मिलाने से उस मूल्य के आसपास ऑफसेट समायोजन को बढ़ावा मिलता है जिसका पैमाना पहले से ही गलत है। स्थानीय स्वरूपण का निरीक्षण करने से पहले इकाई को सत्यापित करें।
इसी तरह, एक गलत युग की उत्पत्ति सेकंड और मिलीसेकंड दोनों के तहत निरर्थक रह सकती है। यदि कोई भी व्याख्या किसी ज्ञात घटना से मेल नहीं खाती है, तो टॉगल करना बंद करें और निर्माता की जांच करें। एक कन्वर्टर परिकल्पनाओं को संक्षिप्त करता है; इससे यह सिद्ध नहीं होता कि प्रत्येक बड़ा पूर्णांक Unix समय है।
यदि वर्ष प्रशंसनीय है लेकिन घंटा लगातार विस्थापित होता है, तो ज़ोन प्रस्तुति की जाँच करें। इन लक्षण पैमानों को अलग रखने से स्क्रीनशॉट से मूल कारण तक का रास्ता छोटा हो जाता है।
टेकअवे: एक गलत इकाई एक गलत सदी है - और Unix टाइमस्टैम्प कन्वर्टर की बताई गई इकाई आपको एक पल में दोनों रीडिंग का परीक्षण करने की सुविधा कैसे देती है
एक गलत इकाई कॉस्मेटिक मेटाडेटा नहीं है - यह तुरंत बदल जाती है। निर्माता-उपभोक्ता सीम का निरीक्षण करने के लिए 1970-भारी स्क्रीन और अविश्वसनीय रूप से दूर के वर्षों को सिग्नल के रूप में मानें। मूल्य, इकाई अनुबंध और ज्ञात घटना स्पष्ट रूप से उचित तिथि से अधिक मजबूत तीन-भाग का प्रमाण बनाते हैं।
स्पष्ट रीडिंग की तुलना करने के लिए कन्वर्टर का उपयोग करें, फिर चुने गए पैमाने को नाम, प्रकार और परीक्षणों में एन्कोड करें। लक्ष्य सॉफ़्टवेयर को अधिक चतुराई से अनुमान लगाना सिखाना नहीं है। यह उस पथ से अनुमान को हटाना है जो उपयोगकर्ताओं के लिए तिथियां बनाता है।
एक कोड समीक्षा प्रत्येक सीमा पर एक सटीक प्रश्न पूछ सकती है: कौन सी इकाई प्रवेश करती है, और कौन सी इकाई निकलती है? यह अंकों की एक विशेष संख्या को पहचानने से अधिक विश्वसनीय है।