JavaScript में एक अंतर्निहित ऑब्जेक्ट Date है। यह तारीख और समय संग्रहीत करता है और उनके प्रबंधन के लिए मेथड देता है।
यह Java की java.util.Date क्लास पर आधारित था, जिसे 2010 के दशक की शुरुआत में बदल दिया गया, लेकिन बैकवर्ड कंपैटिबिलिटी के लिए JavaScript का Date अब भी बना हुआ है।
सामान्य रूप से तारीखों के साथ काम करना जितना मुश्किल है, और टाइमज़ोन संभालने का तरीका जितना खराब या लगभग न के बराबर है, उसकी वजह से moment.js, day.js, date-fns और luxon जैसी बहुत सी लाइब्रेरी मौजूद हैं।
इनमें से कोई भी Exercism पर उपलब्ध नहीं है।
अपने प्रोजेक्ट में moment.js जैसे पुराने पड़ चुके या बिना देखभाल वाले पैकेज का उपयोग न कीजिए, बल्कि luxon जैसे ज़्यादा आधुनिक विकल्पों पर भरोसा कीजिए, या उस Temporal पर जो अभी व्यापक रूप से उपलब्ध नहीं है।
यह अभ्यास Date पर केंद्रित है, जो JavaScript के अंत तक प्रासंगिक बना रहेगा।
Date ऑब्जेक्ट Date क्लास का एक इंस्टेंस होता है।
इसे कंस्ट्रक्टर फंक्शन को कोई आर्गुमेंट पास किए बिना बनाया जा सकता है।
इससे एक ऐसा Date ऑब्जेक्ट बनता है जो वर्तमान तारीख और समय दर्शाता है:
const now = new Date();
// => Thu Apr 14 2022 11:46:08 GMT+0530 (India Standard Time)
// Shows current day, date and time (in your time zone).
अगर कोई संख्या दी जाती है, तो उसे timestamp के रूप में समझा जाएगा।
टाइमस्टैम्प एक पूर्णांक संख्या है जो बताती है कि 1 जनवरी 1970 UTC+0 के बाद से कितने मिलीसेकंड बीत चुके हैं।
const epoch = new Date(0);
// Thu Jan 01 1970 01:00:00 GMT+0100 (Central European Standard Time)
const another = new Date(1749508766627);
// Tue Jun 10 2025 00:39:26 GMT+0200 (Central European Summer Time)
कोई यह सोच सकता है कि new Date(0) सबसे "शुरुआती" तारीख वाला ऑब्जेक्ट बनाएगा, लेकिन JavaScript तारीख को आपके लोकल टाइमज़ोन में बदल देता है। इसका मतलब है कि असल में सिर्फ वे लोग जिनका टाइमज़ोन GMT / UTC+0 है, उन्हें ही Unix epoch वैल्यू मिलेगी।
आप Date कंस्ट्रक्टर को तारीख दर्शाने वाली एक स्ट्रिंग वैल्यू पास कर सकते हैं।
हर इम्प्लीमेंटेशन में एक जैसा रहने वाला एकमात्र फॉर्मेट अंतरराष्ट्रीय स्तर पर मान्य और मानकीकृत तथाकथित ISO 8601 टाइमस्टैम्प स्ट्रिंग का सरल रूप है।
UTC में समय का एक क्षण ऐसा दिखता है:
YYYY-MM-DDTHH:mm:ss.mssZ
YYYYMMDDTHHmmss.mssZ
जहाँ नीचे दिए गए हिस्सों की जगह ये चीज़ें आती हैं:
| चिह्न | विवरण | डिफॉल्ट |
|---|---|---|
| YYYY | कैलेंडर वर्ष, 4 अंकों में | |
| MM | कैलेंडर महीना, 2 अंकों में | 01 |
| DD | कैलेंडर दिन, 2 अंकों में | 01 |
| T | एक अक्षर T, जो तारीख को समय से अलग करता है | |
| HH | 24 घंटे की घड़ी के घंटे, 2 अंकों में | 00 |
| mm | मिनट, 2 अंकों में | 00 |
| ss | सेकंड, 2 अंकों में | 00 |
| mss | मिलीसेकंड, 3 अंकों में | 000 |
| Z | एक अक्षर Z, या एक ऑफसेट +/-HH:mm
|
अक्षर Z UTC दर्शाता है (न टाइमज़ोन, न डेलाइट सेविंग)।
चूँकि ज़्यादातर हिस्सों के लिए डिफॉल्ट वैल्यू मौजूद हैं, इसलिए अंत से कुछ हिस्से हटा देना भी सही है:
YYYY-MM-DD
इसका डिफॉल्ट समय 00:00:00.000 होता है
अगर टाइमस्टैम्प Z पर खत्म नहीं होता, और +HH:mm या -HH:mm (यानी टाइमज़ोन ऑफसेट) पर भी नहीं खत्म होता, तो ऐतिहासिक कारणों से यह लागू होता है:
जब टाइमज़ोन ऑफसेट मौजूद नहीं होता, तो सिर्फ तारीख वाले रूप UTC समय माने जाते हैं और तारीख-समय वाले रूप लोकल समय माने जाते हैं। UTC समय माने जाने की वजह स्पेक में हुई एक ऐतिहासिक गलती है, जो ISO 8601 से मेल नहीं खाती थी, लेकिन वेब कंपैटिबिलिटी की वजह से उसे बदला नहीं जा सका। देखिए टूटा पार्सर: वेब की एक वास्तविक समस्या।
Date.parse जो दूसरे फॉर्मेट स्वीकार करता है, वे चल भी सकते हैं और नहीं भी।
JavaScript में तारीखों के साथ काम करते समय, किसी string से Date बनाते वक्त हमेशा ISO 8601 टाइमस्टैम्प का उपयोग कीजिए।
सिर्फ तारीख वाले रूप मान्य हैं, लेकिन ISO 8601 के सभी फॉर्मेट समर्थित नहीं हैं। MDN पर सरल रूप की व्याख्या वाला पेज देखिए।
किसी मौजूदा तारीख ऑब्जेक्ट को भी कंस्ट्रक्टर आर्गुमेंट के रूप में इस्तेमाल किया जा सकता है।
इससे मौजूदा Date ऑब्जेक्ट की एक कॉपी बनती है, जिसमें वही तारीख और समय होता है।
const t1 = new Date();
const t2 = new Date(t1);
// Values of t1 and t2 will be the same.
सिर्फ तारीख दर्शाने वाली तारीख तीन संख्याएँ पास करके बनाई जा सकती है। तारीख और समय दर्शाने वाली तारीख 6 संख्याएँ पास करके बनाई जा सकती है।
const date1 = new Date(95, 11, 17);
// Creates Date for Dec 17 1995 00:00 if your local timezone is equivalent to UTC.
const date2 = new Date(2013, 12, 5, 13, 24, 0);
// Creates Date for Jan 5 2014 13:24 if your local timezone is equivalent to UTC.
दूसरी वैल्यू month होती है, जो जनवरी के लिए 0 से शुरू होकर दिसंबर के लिए 11 तक जाती है।
Date.parse()आपको कहीं तारीख पार्स करने वाले फंक्शन Date.parse का ज़िक्र या संदर्भ मिल सकता है।
इस फंक्शन के लिए बहुत कम अपरिवर्तनीय (हमेशा सही) बातें हैं, और बाकी इम्प्लीमेंटेशन तय नहीं है (यानी मानक नहीं है), इसलिए इसका उपयोग नहीं करना चाहिए।
Date के घटकों को एक्सेस करनातारीख ऑब्जेक्ट पर कई मेथड होते हैं जो तारीख के घटक लौटाते हैं:
getFullYear(); // Get the year (4 digits)
getMonth(); // Get the month, from 0 to 11.
getDate(); // Get the day of month, from 1 to 31.
getHours(); // Get the hour in a 24 clock, from 0 to 23
getMinutes(); // Get the minutes, from 0 to 59
getSeconds(); // Get the seconds, from 0 to 59
getMilliseconds(); // Get the milliseconds, from 0 and 999
getDay(); // Get the day of week, from 0 (Sunday) to 6 (Saturday).
इनमें से हर एक के लिए वैल्यू अपडेट करने वाला एक set रूप भी मौजूद है (जैसे setFullYear)।
सीमा से बढ़ी हुई कोई भी वैल्यू अगले घटक में चली जाती है:
const date = new Date('2025-02-28T12:42:00Z');
// => Fri Feb 28 2025 13:42:00 GMT+0100 (Central European Standard Time)
date.setDate(29);
// there was no February 29th in 2025.
date.getDate();
// => 1
date.toString();
// => Sat Mar 01 2025 13:42:00 GMT+0100 (Central European Standard Time)
उन सभी मेथड के UTC रूप भी हैं जो लोकल टाइमज़ोन को नहीं मानते।
तारीख ऑब्जेक्ट में एक मेथड getTime() होता है, जो UNIX टाइमस्टैम्प मिलीसेकंड में लौटाता है, यानी 1 जनवरी 1970 की आधी रात, UTC से अब तक बीते मिलीसेकंड की संख्या।
इसके अलावा, तारीख ऑब्जेक्ट को ISO 8601 टाइमस्टैम्प स्ट्रिंग में बदलने के लिए एक मेथड toISOString() भी उपलब्ध है।
दो तारीखों के बीच, या किसी तारीख और संख्या के बीच, इससे बड़ा (>), इससे बड़ा या बराबर (>=), इससे छोटा (<) और इससे छोटा या बराबर (<=) सीधे इस्तेमाल किए जा सकते हैं।
यह इसलिए काम करता है क्योंकि JavaScript तारीख को एक प्रिमिटिव में बदलने की कोशिश करता है।
दो तारीखों के बीच, या तारीख और संख्या के बीच तुलना करते समय, JavaScript [Symbol.toPrimitive]("number") को कॉल करता है, जो अंदर से date.valueOf() को कॉल करता है।
यही date.getTime() को कॉल करने जैसा है।
अगर आप इस व्यवहार पर निर्भर नहीं रहना चाहते, तो पहले getTime() से संख्या में बदल लीजिए।
तारीखों की तुलना समानता (== और ===) से नहीं की जा सकती, लेकिन .getTime() के परिणाम की की जा सकती है।
इस अभ्यास में आप अपॉइंटमेंट संभालने के लिए कुछ फंक्शन पर काम करेंगे। यह सिस्टम हर चीज़ को ISO 8601 फॉर्मेट की स्ट्रिंग में रखता है, लेकिन लोग कैलेंडर का इस्तेमाल इस तरह नहीं करते। अलग-अलग फॉर्मेट के बीच बदलने के लिए कई फंक्शन ज़रूरी हैं।
अभी से n दिन बाद, वर्तमान समय पर एक अपॉइंटमेंट बनाइए। यह फंक्शन n दिन लेता है और अभी से n दिन बाद का अपॉइंटमेंट समय लौटाता है।
createAppointment(4, now);
// Given now is Sun Oct 05 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)
// => Sun Oct 09 2022 23:28:43 GMT+0600 (Bangladesh Standard Time)
अगर दूसरा पैरामीटर now इस्तेमाल नहीं किया गया है, तो उसकी जगह वर्तमान समय लिया जाना चाहिए।
कई टूल सिर्फ अंतरराष्ट्रीय स्तर पर मानकीकृत ISO 8601 फॉर्मेट के साथ ही काम करते हैं। getAppointmentTimestamp फंक्शन लिखिए, जो एक तारीख ले और उस फॉर्मेट में एक स्ट्रिंग लौटाए।
const appointment = new Date(Date.UTC(2010, 6, 16, 12, 42, 0, 0));
getAppointmentTimestamp(appointment);
// => '2010-07-16T12:42:00.000Z'
टाइमस्टैम्प पढ़ना मुश्किल होता है, इसलिए अपॉइंटमेंट की जानकारी निकालने वाला फंक्शन इसमें मदद करेगा। getAppointmentDetails फंक्शन ISO 8601 फॉर्मेट का एक टाइमस्टैम्प लेता है और वर्ष, महीना, तारीख, घंटा और मिनट लौटाता है।
getAppointmentDetails('2022-04-24T08:15:00.000');
// => { year: 2022, month: 3, date: 24, hour: 8, minute: 15 }
यह फंक्शन पहले आर्गुमेंट के रूप में अपॉइंटमेंट का समय लेगा और दूसरे आर्गुमेंट के रूप में कुछ विकल्पों का ऑब्जेक्ट। आपको ऑब्जेक्ट में दिए गए विकल्पों के अनुसार अपॉइंटमेंट बदलना है और उसकी नई तारीख लौटानी है। विकल्पों के ऑब्जेक्ट में एक से अधिक विकल्प हो सकते हैं।
updateAppointment('2022-02-09T09:20:00.000', { month: 6 });
// => { year: 2022, month: 6, date: 9, hour: 10, minute: 20 }
यह फंक्शन आर्गुमेंट के रूप में दो अपॉइंटमेंट (टाइमस्टैम्प) लेगा। आपको उन दोनों समयों के बीच का अंतर सेकंड में लौटाना है।
आधा सेकंड लगभग बेमानी है, इसलिए संख्या को लौटाने से पहले पूर्णांकित कर दीजिए।
timeBetween('2022-12-12T09:20:00.000', '2022-12-18T08:30:00.000');
// => 515400
अंत में, अपॉइंटमेंट बन जाने के बाद सिस्टम को जाँचना होता है कि वह मान्य है या नहीं। दूसरे शब्दों में, अपॉइंटमेंट भविष्य में होना चाहिए, बीते समय में नहीं।
isValid फंक्शन लिखिए, जो दो आर्गुमेंट लेता है: अपॉइंटमेंट का टाइमस्टैम्प (स्ट्रिंग) और वर्तमान समय का टाइमस्टैम्प (स्ट्रिंग)। अगर वर्तमान समय के हिसाब से अपॉइंटमेंट भविष्य में है, तो यह true लौटाता है।
isValid('2022-02-11T23:00:00.000', '2022-02-08T23:00:00.000');
// => true
Exercism पर साइन अप कीजिए और JavaScript को 37 कॉन्सेप्ट159 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।