«कितने दिन बीत गए?» — वह सवाल जो शुरुआती लोगों को तोड़ देता है
\n\nहर PHP-डेवलपर को देर-सबेर इस कार्य का सामना करना पड़ता है: दो तिथियों के बीच कितने दिन बीते हैं, यह पता लगाना। लगता है, इससे आसान क्या हो सकता है? दो स्ट्रिंग लें, एक को दूसरे से घटाएँ — और हो गया। लेकिन यहीं पर, बिना किसी कारण के, सबसे घातक गलतियाँ होती हैं।
\n\nहमने Stack Overflow पर नज़र डाली और एक वास्तविक प्रश्न «Finding the number of days between two dates» पाया, जिसे हज़ारों बार देखा गया। पता चला कि अनुभवी प्रोग्रामर भी समय क्षेत्रों, unix-टाइमस्टैम्प और strtotime() के अप्रत्याशित व्यवहार से जुड़े जाल में फँस जाते हैं।
इस लेख में हम PHP में तिथियों के बीच दिनों की संख्या की गणना करते समय पाँच सबसे सामान्य गलतियों पर चर्चा करेंगे और दिखाएँगे कि उनसे कैसे बचा जाए। अपना एडिटर तैयार रखें — बहुत सारा कोड और व्यावहारिक सुझाव होंगे।
\n\nगलती नंबर 1: unix-टाइमस्टैम्प को सीधे घटाना
\n\nसबसे आम गलती — टाइमस्टैम्प को सरलता से घटाकर तिथियों के बीच अंतर प्राप्त करने का प्रयास:
\n\n<?php\n$date1 = strtotime('2024-01-01');\n$date2 = strtotime('2024-01-10');\n$days = ($date2 - $date1) / (60 * 60 * 24);\necho $days; // 9\n?>\n\nबाहरी तौर पर सब कुछ काम करता है। लेकिन घड़ी को डेलाइट सेविंग टाइम पर सेट करने का प्रयास करें। «गर्मी» में जाने पर दिन एक घंटा छोटा हो जाता है, और वापस आने पर लंबा हो जाता है। परिणाम: ठीक 9 के बजाय 9.04166 या 8.95833 दिन।
\n\nकैसे ठीक करें
\nDateTime ऑब्जेक्ट और diff() मेथड का उपयोग करें। वे समय के सभी उतार-चढ़ाव को ध्यान में रखते हैं:
<?php\n$date1 = new DateTime('2024-01-01');\n$date2 = new DateTime('2024-01-10');\n$interval = $date1->diff($date2);\necho $interval->days; // 9 — हमेशा सही\n?>\n\nDateTime::diff के माध्यम से PHP में तिथियों के अंतर के साथ काम करना उद्योग का मानक है। इस पैटर्न को याद रखें।
गलती नंबर 2: समय क्षेत्र को अनदेखा करना
\n\nकल्पना करें: आपका सर्वर यूरोप/मॉस्को में है, और न्यूयॉर्क का उपयोगकर्ता तिथि «2024-03-10» दर्ज करता है। आप बिना समय क्षेत्र बताए DateTime बनाते हैं। PHP सर्वर के सिस्टम टाइमज़ोन का उपयोग करता है। परिणाम: दिनों का अंतर एक से «भटक» सकता है।
यह विशेष रूप से महीनों की सीमाओं और डेलाइट सेविंग टाइम में बदलाव के लिए महत्वपूर्ण है। यह गलती शायद ही कभी दिखाई देती है, लेकिन जब यह प्रोडक्शन में सामने आती है — तो इसे पकड़ना बहुत मुश्किल होता है।
\n\nसमाधान: स्पष्ट रूप से समय क्षेत्र निर्धारित करें
\n<?php\n$tz = new DateTimeZone('UTC');\n$date1 = new DateTime('2024-03-10', $tz);\n$date2 = new DateTime('2024-03-20', $tz);\n$interval = $date1->diff($date2);\necho $interval->days; // 10 — सटीक\n?>\n\nआंतरिक गणनाओं के लिए हमेशा UTC का उपयोग करें। यदि उपयोगकर्ता को तिथि दिखानी है — तो केवल आउटपुट के चरण में उसके स्थानीय समय क्षेत्र में बदलें।
\n\nगलती नंबर 3: days और format('%a') के बीच भ्रम
\n\nDateInterval ऑब्जेक्ट में एक प्रॉपर्टी days और एक मेथड format('%a') है। लगता है कि ये एक ही हैं। लेकिन एक बारीकी है:
- \n
$interval->days— दिनों की कुल संख्या (सभी महीनों और वर्षों को ध्यान में रखता है)। मान हमेशा सही होता है। \n $interval->format('%a')— वही, लेकिन स्ट्रिंग के रूप में। \n $interval->d— केवल दिन महीनों को छोड़कर। यदि अंतर 35 दिन है, तोd4 लौटाएगा (एक महीना घटाने के बाद शेष)। \n
शुरुआती लोग अक्सर d और days को भ्रमित करते हैं। परिणामस्वरूप, उन्हें 35 के बजाय 4 दिन मिलते हैं। इससे रिपोर्ट, बिलिंग और टास्क शेड्यूलर में बग आते हैं।
हमेशा जाँचें कि आप किस प्रॉपर्टी का उपयोग कर रहे हैं
\n<?php\n$date1 = new DateTime('2024-01-01');\n$date2 = new DateTime('2024-02-05');\n$interval = $date1->diff($date2);\n\necho $interval->days; // 35\necho $interval->d; // 4 — यह वही नहीं है!\n?>\n\nयदि आपको वास्तव में दो तिथियों के बीच दिनों की संख्या चाहिए — तो