जावास्क्रिप्ट के डेट कंस्ट्रक्टर में महीने का तर्क 0 से 11 तक क्यों है?


128

Dateनीचे दिए गए कॉल का उपयोग करके जावास्क्रिप्ट में एक नई वस्तु को इनिशियलाइज़ करते समय, मुझे पता चला कि महीने का तर्क शून्य से शुरू होता है।

new Date(2010, 3, 1);  // that's the 1st April 2010!

महीने का तर्क 0 से क्यों शुरू होता है? दूसरी ओर, महीने के तर्क का दिन (अंतिम एक) 1 से 31 तक की संख्या है। क्या इसके लिए अच्छे कारण हैं?


96
बस आपको अपने पैर की उंगलियों पर रखना है।
सीनजेए

4
एक जो शून्य अनुक्रमित भी है वह the Day of the week (integer)0-6
सीनजा

क्योंकि इसे मशीनों के लिए कोड किया गया था और मनुष्यों के लिए नहीं। लेकिन यह अभी भी कीड़े का एक बड़ा स्रोत है क्योंकि बहुत सारे कोड मनुष्यों द्वारा लिखे गए हैं (अभी भी) :)
क्रिस्टोफ़ रूसो

4
@ श्रीपति को यही तर्क दिन और वर्ष पर भी लागू होना चाहिए।
एगेल कुरियन

2
@ChristopheRoussy हाँ, अगर इसे मशीनों के लिए कोडित किया गया था, तो 1 दिन से सूचकांक दिन क्यों?
user151496

जवाबों:


55

यह प्रोग्रामिंग दुनिया में एक पुरानी (शायद दुर्भाग्यपूर्ण, शायद मर रही है) परंपरा है, पुराने मानक (POSIX) स्थानीय समय सी फ़ंक्शन http://linux.die.net/man/3/localtime देखें


14
JS Dateऑब्जेक्ट जावा 1.0 से पोर्ट किया गया था, इसीलिए। इसकी सभी खामियों को दूर करते हुए ... stackoverflow.com/questions/344380/…
c69

1
आप सही हैं, परंपराएं आमतौर पर पूरी तरह से असंगत होती हैं और अक्सर तर्कहीन होती हैं और मैं वास्तव में उम्मीद करूंगा कि ऐसी "बुरी" परंपराएं वास्तव में मर रही हैं ...
हेनन

1
2019 है और मैं इस व्यवहार के संबंध में समस्या फिक्सिंग कर रहा हूँ और जावास्क्रिप्ट न बहिष्कार करें इस यह अभी भी क्या होगा के रूप में कोणीय के रूप में चौखटे भाषाओं के रूप में इतनी के रूप में लंबे समय तक, - मुफ्त coment करने के लिए वर्ष 2025 में और पर ;-) महसूस
मौरिसियो ग्रासिया Gutierrez

यह एक परंपरा है जो मुझे हमेशा तारीखों के साथ डिबगिंग के मुद्दों पर समय बिताती है ... आश्चर्य है कि इस परंपरा के कारण बर्बाद हुए काम के घंटों की कितनी मिलिंग हुई।
वेदमांत

102

इस सवाल का असली जवाब, यह है कि यह से कॉपी किया गया था java.util.Date , जिसमें यह क्वर्क भी था। सबूत ब्रेंडन ईच से ट्विटर पर पाया जा सकता है - वह व्यक्ति जिसने मूल रूप से जावास्क्रिप्ट लागू किया था ( Dateवस्तु सहित ):

https://twitter.com/BrendanEich/status/481939099138654209

पहला ट्वीट

https://twitter.com/BrendanEich/status/771006397886533632

दूसरा ट्वीट

यह 1995 में हुआ था, और JDK 1.0 बीटा में था। यह 1996 में शुरू किया गया था। 1997 में, JDK 1.1 बाहर आया, जिसमें अधिकांश कार्यों को हटा दिया गया java.util.Date, उन्हें आगे बढ़ा दिया गयाjava.util.Calendar , लेकिन यहां तक ​​कि अभी भी शून्य-आधारित महीने थे। डेवलपर्स ने इससे तंग आकर जोडा-टाइम लाइब्रेरी बनाई , जिसके कारण आखिरकार इसका निर्माण हुआjava.time जावा 8 (2014) को बेक किए पैकेज की ओर ले गई।

संक्षेप में, जावा को एक सही ढंग से डिज़ाइन की गई तारीख / समय एपीआई बिल्ट-इन प्राप्त करने में 18 साल लग गए, लेकिन जावास्क्रिप्ट अभी भी अंधेरे युग में वापस फंस गया है। हम वास्तव में Moment.js , दिनांक-fns , और js-joda जैसे उत्कृष्ट पुस्तकालय हैं । लेकिन अब तक, Dateअंतर्निहित भाषा से ज्यादा कुछ नहीं है । उम्मीद है कि यह निकट भविष्य में बदल जाएगा।


24
आह ... अच्छा पुराना डेमो-संचालित विकास पद्धति।
अल्वारो गोंजालेज

@ WouldlvaroGonzález मैं मूल JDK 1.0 डेवलपर को दोष दूंगा जिन्होंने इसे पहले स्थान पर पेश किया।
बमुश्किल

30

सब कुछ लेकिन महीने का दिन 0 आधारित है, यहाँ श्रेणियों सहित पूरी सूची देखें :)

यह वास्तव में 1 आधारित दिन हैं जो यहां के ऑडबॉल हैं ... अजीब तरह से पर्याप्त हैं। ऐसा क्यों किया गया? मुझे नहीं पता ... लेकिन संभवतः वही बैठक हुई थी जिसमें वे पलटे और निर्णय लिया कि अर्धविराम वैकल्पिक थे।


1
"लोगों पर आधारित" दिनों की बात शायद इसलिए है क्योंकि उनके दाहिने दिमाग में कोई भी कभी भी दिनों (जैसे { "first", "second", "third", ..., "twenty-seventh", ... }) के लिए स्ट्रिंग नामों की एक सरणी नहीं बनाएगा और इसके द्वारा अनुक्रमित करने का प्रयास करेगा tm_mday। तो फिर, शायद वे सिर्फ एक त्रुटि एक नियमित घटना से दूर करने में पूर्ण उपयोगिता देखी ।
डी। शेवले

वे वर्ष 0 आधारित क्यों नहीं हैं?
वेदमांत

5

एक वर्ष में हमेशा 12 महीने होते हैं, इसलिए शुरुआती सी कार्यान्वयन ने एक स्थिर निश्चित-चौड़ाई वाले सरणी का उपयोग किया हो सकता है जिसमें सूचकांक 0..11 है।


2
जावा तिथि / कैलेंडर कार्यान्वयन कुछ कैलेंडर के लिए एक अतिरिक्त महीने के लिए समर्थन बनाए रखता है। en.wikipedia.org/wiki/Undecimber
Pointy

4

जावा में भी इसकी तरह .. शायद int को string (0 - jan, 1-feb) में बदलने के लिए, उन्होंने इस तरह कोडित किया .. क्योंकि उनके पास महीने के नाम और इन महीनों में एक स्ट्रिंग स्ट्रिंग (0 से अनुक्रमित) हो सकती है संख्या अगर वे 0 से शुरू करते हैं, तो महीने के तार के लिए मैप करना बहुत आसान हो जाएगा ..


3

मुझे पता है कि यह वास्तव में मूल प्रश्न का उत्तर नहीं है, लेकिन मैं आपको इस समस्या के लिए अपना पसंदीदा समाधान दिखाना चाहता था, जिसे मैं कभी याद नहीं करता क्योंकि यह समय-समय पर पॉप अप होता है।

छोटा फ़ंक्शन ज़ेरोफिल करता है जहाँ ज़रुरत पड़ने पर ज़ीरो को भरने की ट्रिक होती है, और महीना अभी +1जोड़ा जाता है:

function zerofill(i) {
    return (i < 10 ? '0' : '') + i;
}

function getDateString() {
    const date = new Date();
    const year = date.getFullYear();
    const month = zerofill(date.getMonth()+1);
    const day = zerofill(date.getDate());
    return year + '-' + month + '-' + day;
}

लेकिन हां, डेट में एक बहुत ही अनचाहा एपीआई है, जब मैं ब्रेंडन इच के ट्विटर को पढ़ रहा था, तो मैं हंस रहा था।


2

हो सकता है कि वे महीनों को एन्यूमरेशन मानते हों (पहला इंडेक्स 0 हो) और दिन नहीं क्योंकि उनके पास कोई नाम नहीं है।

या यों कहें कि उन्हें लगा कि दिन की संख्या दिन का वास्तविक प्रतिनिधित्व है (उसी तरह से महीनों को 12/31 जैसी तारीखों में संख्याओं के रूप में दर्शाया जाता है), जैसे कि आप चर के रूप में संख्याओं के साथ गणना कर सकते हैं, लेकिन वास्तव में 0-आधारित।

इसलिए वास्तव में, महीनों के लिए, शायद उन्हें लगा कि संख्याओं के बजाय महीने के नाम का उपयोग करने के लिए उचित गणन प्रतिनिधित्व होगा, और यदि दिन का नाम प्रतिनिधित्व होता तो वे ऐसा ही करते। सोचिए अगर हम 5 जनवरी, 6 जनवरी आदि के बजाय पांच जनवरी, छठे जनवरी को कहेंगे, तो शायद उन्होंने 0 दिनों के लिए 0-आधारित गणना भी की होगी।

शायद अवचेतन रूप से उन्होंने महीनों के लिए एक गणना के बारे में सोचा था जैसे कि {जनवरी, फरवरी, ...} और दिनों के लिए {वन, टू, थ्री, ...} के रूप में, उन दिनों को छोड़कर, जब आप नाम के बजाय एक नंबर के रूप में दिन का उपयोग करते हैं, 1 के लिए 1 की तरह, आदि, तो 0 पर शुरू करना असंभव है ...


आपको साइकोलॉजिस्ट को ड्यूल-क्लास करना चाहिए। यह अभी भी एक गलती है जो उन्होंने की थी, लेकिन कम से कम अब हम समझते हैं कि उन्होंने इसे क्यों बनाया।
Zesty

0

यह एक दोष हो सकता है, लेकिन यह तब भी बहुत उपयोगी होता है जब आप सप्ताह के महीनों या दिनों को एक स्ट्रिंग के रूप में प्रस्तुत करना चाहते हैं, आप बस एक सरणी बना सकते हैं जैसे ['जान,' फेब '... आदि] [नई तारीख () .getMonth ()] के स्थान पर ['', 'जान', feb ... आदि] [नई तिथि ()। getMonth ()] या ['जन', 'feb' ... आदि] [नई तिथि ( ) .getMonth () - 1]

महीने के दिन सामान्य नहीं हैं, इसलिए आप उन लोगों के नाम के साथ ऐरे नहीं बना पाएंगे। इस मामले में 1-31 को संभालना आसान है, इसलिए आप हर बार 1 घटाना चाहते हैं ...


ज़रुरी नहीं। आप आसानी से सिर्फ एक घटा सकते हैं। यह हल करने की तुलना में अधिक समस्याएं पैदा करता है क्योंकि अब जब आप तिथियों के साथ गणित करते हैं, तो आपको महीने में अक्सर विशिष्ट हेरफेर करना पड़ता है।
रेय
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.