Ask HN: क्या आज आपको कोई लीप-ईयर बग मिला?
लीप डे 2024 ने सॉफ्टवेयर और हार्डवेयर में आश्चर्यजनक रूप से कई विफलताएँ उजागर कीं—टूटे हुए भुगतान सिस्टम, एक्सेस-कंट्रोल लॉक, गेम्स, और घड़ियों से लेकर यूनिट टेस्ट, बिलिंग सिस्टम, और यहाँ तक कि बड़े भाषा मॉडल्स द्वारा February 29 को अमान्य मानने तक। योगदानकर्ताओं के अनुसार इन त्रुटियों का बड़ा हिस्सा भोले date arithmetic (जैसे “एक वर्ष घटाओ”), कस्टम time handling, और rolling anniversaries, certificates, तथा retention windows जैसे किनारे के मामलों से जुड़ा है जिन्हें leap years के पार परीक्षण नहीं किया गया। ये घटनाएँ लंबे समय से दी जा रही सलाह को पुष्ट करती हैं: mature date/time libraries पर भरोसा करें, समय के आसपास स्पष्ट business rules बनाएं, और दुर्लभ calendar मामलों का स्पष्ट परीक्षण करें, बजाय यह मानने के कि वे “बस काम कर लेंगे”।
वास्तविक दुनिया में आउटेज और परिचालन संबंधी समस्याएँ
- कई भुगतान प्रणालियाँ विफल रहीं:
- एक बड़ी स्वीडिश किराना श्रृंखला और न्यूज़ीलैंड के सेल्फ-सर्विस फ्यूल पंप कार्ड भुगतान संसाधित नहीं कर सके, जिससे नकद या ऐप-आधारित वर्कअराउंड अपनाने पड़े।
- कुछ क्रेडिट-कार्ड और इनवॉइसिंग प्रणालियों ने Feb 29 मिलने पर देय तिथियाँ या सूचनाएँ गलत तरीके से शेड्यूल कीं।
- भौतिक दुनिया की प्रणालियों में गड़बड़ियाँ आईं:
- होटल की कीकार्ड्स काम करना बंद कर गईं, जिससे विशेष हार्डवेयर रीसेट की ज़रूरत पड़ी; 2020 से मिलती-जुलती समस्या का भी उल्लेख किया गया।
- पेरिस और कम-से-कम एक परिसर में स्ट्रीटलाइट्स रात में बंद रहीं, संभवतः तिथि-आधारित नियंत्रण के कारण।
- एक्सेस-कंट्रोल कैमरे और कुछ सोलर/ऊर्जा मॉनिटरिंग प्रणालियों ने प्रवेश रोक दिया या डेटा लॉग करना बंद कर दिया।
- उपभोक्ता सेवाएँ और गेम्स:
- कई EA टाइटल्स और विशिष्ट गेम्स (जैसे रेसिंग और रिद्म टाइटल्स) क्रैश हो गए या खिलाड़ियों को तब तक बाहर रखा जब तक सिस्टम घड़ियाँ 1 मार्च पर नहीं कर दी गईं।
- एयरलाइनों और परिवहन ऐप्स ने गलत तिथियाँ प्रिंट कीं या शेड्यूल गलत लेबल किए, कभी-कभी वर्कअराउंड के रूप में बैनर डिस्क्लेमर के साथ।
- Cloudflare बिलिंग में एक व्यापक बिलिंग घटना के साथ “1970-01-01” दिनांक वाले इनवॉइस बने।
लीप-ईयर के साथ प्रोग्रामिंग की गलतियाँ
- कई बग भोले “एक वर्ष जोड़ो/घटाओ” तर्क से आए:
replace(year=year±1)का उपयोग करने वाला कोड या 365 दिनों की धारणा रखने वाला कोड त्रुटियाँ फेंक देता था या गलत तिथियाँ बनाता था (जैसे DB2 में 1894‑02‑29)।- रोलिंग-ईयर और YTD गणनाएँ विफल रहीं क्योंकि तुलना वाले वर्ष में Feb 29 नहीं होता।
- “आज” पर निर्भर या निश्चित वर्ष-लंबाई मानने वाले यूनिट टेस्ट CI में टूट गए।
- Python, Java, और अन्य भाषाओं पर चर्चा हुई:
- मानक
timedelta/Durationकेवल days/seconds समर्थित करते हैं; “years” अस्पष्ट हैं। - dateutil के
relativedelta, Arrow, Carbon, date-fns, और .NET केAddYearsजैसी लाइब्रेरीज़ को अधिक सुरक्षित विकल्प बताया गया, लेकिन किनारों के मामलों के लिए फिर भी स्पष्ट निर्णय चाहिए।
- मानक
- परिभाषा पर बहस:
- “एक वर्ष घटाओ” का अर्थ 365/365.25 दिन, वही कैलेंडर तिथि, या वही “semantic” तिथि (जैसे जनवरी का आख़िरी सोमवार) हो सकता है।
- कई लोगों का तर्क है कि जब तक व्यवहार सुसंगत है और क्रैश नहीं करता, कोई भी व्यवहार स्वीकार्य है; जबकि अन्य ज़ोर देते हैं कि कानूनी और व्यावसायिक नियम आम तौर पर “12 कैलेंडर महीने” अपेक्षित करते हैं।
यूज़र अनुभव की विचित्रताएँ और जन्मदिन
- कई घड़ियाँ, ऐप्स, और फ़ॉर्म्स ने बस Feb 29 छोड़ दिया, March 1 दिखाया, या 29 को वैध फ़रवरी तिथि के रूप में अस्वीकार कर दिया; कुछ डिवाइस जानबूझकर फ़रवरी को 28 दिनों का हार्ड-कोड करते हैं।
- लीप-डे जन्मदिनों ने किनारे के मामले उजागर किए:
- प्रणालियाँ उम्र-जाँच, लाइसेंस, और कानूनी सीमाओं के लिए उन्हें अलग-अलग Feb 28 या Mar 1 पर मैप करती हैं, कभी-कभी गलत तरीके से कार्रवाइयाँ रोक देती हैं।
- लोग रिपोर्ट करते हैं कि फ़ॉर्म्स में Feb 29 गायब है, या फ्रंटएंड उसे स्वीकार करके Feb 28 के रूप में सेव कर देता है।
LLMs और मेटा-सीख
- कई रिपोर्टों में कहा गया कि ChatGPT और अन्य LLMs:
- शुरुआत में दावा करते थे कि 2024 लीप ईयर नहीं है या 2024‑02‑29 को अमान्य मानते थे, फिर अपनी व्याख्या के बीच में स्वयं-सुधार कर लेते थे।
- टोकनाइज़ेशन-संबंधी कार्यों (जैसे किसी शब्द में अक्षरों की गिनती) में संघर्ष करते हैं।
- कुछ लोग इसे इस बात का प्रमाण मानते हैं कि LLMs को critical logic के लिए नहीं चलाना चाहिए; अन्य तर्क देते हैं कि यदि sandbox किया जाए तो वे non-critical, human-in-the-loop workflows के लिए ठीक हैं।
- व्यापक सहमति: समय-सम्बंधी हैंडलिंग deceptively hard है; अपनी date logic खुद न बनाएं या Feb 29/century नियमों को नज़रअंदाज़ न करें, और tests में इन किनारे के मामलों को स्पष्ट रूप से कवर करें।