जावास्क्रिप्ट क्यों मिलता है () 108 लौटते हैं?


95

यह जावास्क्रिप्ट 2008 के बजाय 108 क्यों लौटता है? यह दिन और महीने सही हो जाता है लेकिन वर्ष नहीं?

myDate = new Date();
year = myDate.getYear();

वर्ष = १० year?


29
ओह, पापों को हमने Y2K के माध्यम से प्राप्त करने की कोशिश की।
DGentry

3
year = myDate.getFullYear() % 100;
एंड्रयू लार्सन

जवाबों:


128

यह एक Y2K बात है, केवल 1900 के बाद के वर्षों को गिना जाता है।

संभावित अनुकूलता के मुद्दे हैं जो अब getYear()इसके पक्ष में हटा दिए गए हैं getFullYear()- quirksmode से :

मामले को और अधिक जटिल बनाने के लिए, date.getYear () आजकल अपदस्थ है और आपको date.getFullYear () का उपयोग करना चाहिए, जो बदले में पुराने ब्राउज़रों द्वारा समर्थित नहीं है। यदि यह काम करता है, हालांकि, इसे हमेशा पूरा वर्ष देना चाहिए, अर्थात। 100 के बजाय 2000।

आपका ब्राउज़र इन दो विधियों के साथ अगले वर्ष देता है:

* The year according to getYear(): 108
* The year according to getFullYear(): 2008

इंटरनेट एक्सप्लोरर और फ़ायरफ़ॉक्स के बीच कार्यान्वयन अंतर भी हैं, क्योंकि IE का कार्यान्वयन आईबीएम से - getYear()जैसे व्यवहार करने के लिए बदल दिया गया था :getFullYear()

ECMAScript विनिर्देश के अनुसार, वर्ष 1998 के लिए वर्ष का रिटर्न माइनस 1900 मिलता है, मूल रूप से 1998 के लिए "98" वापस करना होता है। getYear को ECMAScript संस्करण 3 में पदावनत किया गया और getFullYear () के साथ बदल दिया गया।

Internet Explorer ने getFearYear () की तरह काम करने के लिए getYear () को बदल दिया और इसे Y2k-compliant बना दिया, जबकि Mozilla ने मानक व्यवहार रखा।


25

चूंकि पुराने ब्राउज़र में getFullYear काम नहीं करता है, आप कुछ इस तरह का उपयोग कर सकते हैं:

Date.prototype.getRealYear = function() 
{ 
    if(this.getFullYear)
        return this.getFullYear();
    else
        return this.getYear() + 1900; 
};

जावास्क्रिप्ट प्रोटोटाइप का उपयोग मौजूदा वस्तुओं का विस्तार करने के लिए किया जा सकता है, बहुत सी # विस्तार विधियों की तरह। अब, हम यह कर सकते हैं;

var myDate = new Date();
myDate.getRealYear();
// Outputs 2008

7
शायद Date.prototyp.getRealYear = Date.prototype.getFullYear की तरह smth? Date.prototyp.getFullYear: function () {इसे लौटाएं ।getYear () + 1900; };
वैलेंटाइन गोले

12

डॉक्स की जाँच करें। यह एक Y2K मुद्दा नहीं है - यह एक Y2K मुद्दे की कमी है! यह निर्णय मूल रूप से C में किया गया था और पर्ल, जाहिरा तौर पर जावास्क्रिप्ट, और शायद कई अन्य भाषाओं में कॉपी किया गया था। बहुत पहले यह स्पष्ट रूप से दो अंकों के वर्षों का उपयोग करने के लिए अभी भी वांछनीय महसूस किया गया था, लेकिन उल्लेखनीय रूप से जिसने भी उस इंटरफ़ेस को डिजाइन किया था, उसे यह महसूस करने के लिए पर्याप्त पूर्वाभास था कि उन्हें सोचने की ज़रूरत है कि वर्ष 2000 और उससे आगे क्या होगा, इसलिए केवल अंतिम दो प्रदान करने के बजाय अंक, उन्होंने 1900 के बाद से वर्षों की संख्या प्रदान की। आप दो अंकों का उपयोग कर सकते हैं, यदि आप जल्दी में थे या जोखिम भरा होना चाहते थे। या यदि आप चाहते हैं कि आपका कार्यक्रम काम करना जारी रखे, तो आप परिणाम में 100 जोड़ सकते हैं और चार अंकों के पूर्ण वर्षों का उपयोग कर सकते हैं।

मुझे याद है कि मैंने पहली बार पर्ल में डेट हेरफेर किया था। अजीब तरह से मैं डॉक्स पढ़ता हूं । जाहिर तौर पर यह कोई सामान्य बात नहीं है। एक या दो साल बाद मुझे 31 दिसंबर, 1999 को कार्यालय में बुलाया गया, ताकि एक बग को ठीक किया जा सके, जिसे कुछ अनुबंध पर्ल कोड में अंतिम संभव मिनट में खोजा गया था, सामान मेरे पास कुछ भी नहीं था। यह सटीक मुद्दा था: 1900 के बाद से मानक तिथि कॉल लौटाया गया था, और प्रोग्रामरों ने इसे दो अंकों के वर्ष के रूप में माना। (उन्होंने अनुमान लगाया कि उन्हें 2000 में "00" मिलेगा। एक युवा अनुभवहीन प्रोग्रामर के रूप में, इसने मेरे दिमाग को उड़ा दिया कि हम एक "पेशेवर" नौकरी के लिए इतना अतिरिक्त भुगतान करेंगे, और उन लोगों ने पढ़ने के लिए भी परेशान नहीं किया था। प्रलेखन। यह मोहभंग के कई वर्षों की शुरुआत थी; अब मैं बूढ़ा और निंदक हूँ। :)

वर्ष 2000 में, वार्षिक वाईएपीसी पर्ल सम्मेलन को इस बार रिपोर्ट किए गए गैर-बग के सम्मान में "YAPC 19100" के रूप में संदर्भित किया गया था।

आजकल, पर्ल दुनिया में, कम से कम, यह डेट-हैंडलिंग के लिए एक मानक मॉड्यूल का उपयोग करने के लिए अधिक समझ में आता है, जो वास्तविक चार-अंकीय वर्षों का उपयोग करता है। निश्चित नहीं है कि जावास्क्रिप्ट के लिए क्या उपलब्ध हो सकता है।


1
हेहे ... दिलबर्ट कार्टून की याद दिलाता है ... "क्या आपने मैनुअल नाम के एक स्पेनिश लड़के के बारे में कहानी पढ़ी है?" ;)
आदिप गुप्ता

मेरा मानना ​​है कि @skiphoppy पाने के लिए 1900 जोड़ रहा है () वांछित पूरे वर्ष का उत्पादन होगा। यह महीने के मानव पठनीय संख्या को पुनः प्राप्त करने के लिए getMonth () में +1 जोड़ने के समान है। उदाहरण: var ts = new Date (); var fullYear = (ts.getYear () + 1900); लेकिन getFullYear () का उपयोग करना पसंद किया जाता है। उदाहरण: var fullYear = new Date ()। GetFullYear ();
recurse


4

का उपयोग करें date.getFullYear()

यह (जैसा कि अन्यत्र सही ढंग से बताया गया है) एक Y2K चीज है। नेटस्केप (2000 से पहले लिखा) मूल रूप से उदाहरण के लिए, लौटे 98से getYear()। वापस लौटने के 00बजाय, यह 100वर्ष 2000 के लिए वापस आ गया। तब अन्य ब्राउज़रों ने साथ आकर इसे अलग तरीके से किया और सभी लोग असंगत होने के कारण दुखी थे।

बाद के ब्राउज़रों ने getFullYearपूरा वर्ष वापस करने के लिए एक मानक विधि के रूप में समर्थन किया।


3

यह सवाल इतना पुराना है कि यह मुझे डॉटकॉम दिनों के लिए रोता है!

यह सही है, Date.getYear () 1900 के बाद के वर्षों की संख्या देता है, जैसे पर्ल का स्थानीय समय ()। एक आश्चर्य है कि 1990 के दशक में डिज़ाइन की गई भाषा सदी के कारोबार के लिए क्यों नहीं होगी, लेकिन मैं क्या कह सकता हूं? आप वहां होना था। यह उस समय एक तरह की समझदारी थी (जैसे पालतू जानवर.कॉम ने किया था)।

2000 से पहले, किसी को "वर्ष 19100 बग" के परिणामस्वरूप getyear () के परिणाम में "19" जोड़कर इस बग को ठीक करने का प्रलोभन दिया गया होगा । दूसरों ने पहले ही इस सवाल का पर्याप्त रूप से उत्तर दिया है (गेटडेट के परिणाम में 1900 जोड़ें) ()।

हो सकता है कि आप जिस पुस्तक के बारे में पढ़ रहे हैं, वह थोड़ी पुरानी हो?

अतीत से विस्फोट के लिए धन्यवाद!


इसका कारण भाषा (पर्ल) का हिसाब नहीं था, क्योंकि यह आँख बंद करके एक सी डिजाइन के फैसले की नकल कर रही थी, जो पहले किया गया था। (20 साल?)
स्किप्पॉपी

मैं जावास्क्रिप्ट पर छाया फेंक रहा था, पर्ल नहीं। पर्ल अक्सर अंतर्निहित सी दिनचर्या को सीधे उजागर करता है। जैसा कि आप कहते हैं, यह अपने समय का एक उत्पाद है। जेएस, कम से कम एक दशक बाद डिजाइन किया गया था, एक अलग मार्ग जा सकता था।
जजोह

2

जैसा कि आपको बताया गया है, कभी भी उपयोग नहीं करना चाहिए, getYear()बल्कि उपयोग करना चाहिए getFullYear()

हालांकि यह कहानी उतनी सरल नहीं है जितनी "IE के GetYear()रूप में लागू होती है getFullYear()। ओपेरा और IE इन दिनों इलाज करते हैं, getYear()जैसा getYear()कि मूल रूप से 2000 से पहले की तारीखों के लिए निर्दिष्ट किया गया था, लेकिन इसे getFullYear()2000 के बाद की तारीखों के लिए इलाज करेंगे , जबकि वेबकिट और फ़ायरफ़ॉक्स पुराने व्यवहार के साथ हैं।

यह सभी ब्राउज़रों में 99 आउटपुट देता है:

javascript:alert(new Date(917823600000).getYear());

यह एफएफ / वेबकीट में 108 और ओपेरा / आईई में 2008 का आउटपुट देता है:

javascript:alert(new Date().getYear());

1

यह गूंगा है। यह पूर्व Y2K दिनों की तारीख है , और अब सिर्फ विरासत के कारणों के लिए 1900 के बाद के वर्षों की संख्या देता है। वास्तविक वर्ष प्राप्त करने के लिए getFullYear () का उपयोग करें।


1

मैं उपयोग कर रहा हूं date.getUTCFullYear(); समस्याओं के बिना काम करना।



0

जैसा कि दूसरों ने कहा है, यह 1900 के बाद के वर्षों की संख्या को लौटाता है। यही कारण है कि ऐसा तब होता है जब 90 के दशक के मध्य में जावास्क्रिप्ट का आविष्कार किया गया था, यह व्यवहार अन्य भाषाओं में तारीख-समय के एपीआई के साथ सुविधाजनक और सुसंगत था। विशेष रूप से सी। और, निश्चित रूप से, एपीआई स्थापित होने के बाद वे इसे पश्चगामी संगतता कारणों से नहीं बदल सकते थे।


0

BTW, अलग-अलग ब्राउज़र अलग-अलग परिणाम दे सकते हैं, इसलिए इस फ़ंक्शन को पूरी तरह से छोड़ देना और getFullYear () हमेशा का उपयोग करना बेहतर है।


0

var date_object = नई तारीख (); var वर्ष = date_object.getYear (); if (वर्ष <2000) {वर्ष = वर्ष + 1900; } // यू मिलेगा पूरा साल ...।


-1

यह 4 अंक वर्ष - 1900 पर लौट रहा है, जो 9+ साल पहले शांत हो सकता था, लेकिन अब बहुत मंद है। जावा का java.util.Date भी यही करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.