नई तारीख () 31 दिसंबर 2014 तक निर्धारित की गई है


80

मैं एक स्ट्रिंग को दिनांक ऑब्जेक्ट में बदलने की कोशिश कर रहा हूं, और यह 31 दिसंबर को छोड़कर सभी दिनों के लिए काम करता है जहां ऑब्जेक्ट 31 दिसंबर के बजाय 1 दिसंबर कहता है। मुझे कोई जानकारी नहीं है की क्यों। यहाँ मेरा JavaScriptकोड है:

var dt = new Date();
dt.setDate("31");
dt.setMonth("11");
dt.setFullYear("2014");

लेकिन मेरा परिवर्तनशील मूल्य है:

Mon Dec 01 2014 11:48:08 GMT+0100 (Paris, Madrid)

यदि मैं किसी अन्य तिथि के लिए भी यही करता हूं, तो मेरी वस्तु उचित मूल्य पर लौट आती है। क्या आपको कुछ पता है कि मैंने क्या गलत किया है?


7
आप पूर्णांक सेट करने के लिए पूर्णांक आदि पास करने के लिए हैं, तार नहीं।
फंकब्रोब

15
आप Dateसीधे निर्माता के मापदंडों का उपयोग कर सकते हैं :new Date(2014, 11, 31)
pomeh

9
btw। 11 नवंबर का महीना नहीं है?
jnovacho


5
@JuhaUntinen नहीं, तारीख को मिलाया गया है क्योंकि अभी महीने में केवल 30 दिन हैं।
श्री लिस्टर

जवाबों:


85

setMonth पहले चाहिए setDate: ( 31 दिनों से कम महीने के लिए सुरक्षित नहीं )

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);

और setMonthदूसरा पैरामीटर भी तिथि निर्धारित करने के लिए इस्तेमाल किया जा सकता है।

var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11, 31);


यदि कंस्ट्रक्टर के लिए कोई तर्क नहीं दिया जाता है, तो यह सिस्टम सेटिंग्स के अनुसार वर्तमान तिथि और समय का उपयोग करेगा ।

तो, का उपयोग करना setMonthऔर setDateअलग से अभी भी अप्रत्याशित परिणाम का कारण होगा।

यदि सेट किए गए मान उनकी तार्किक सीमा से अधिक हैं , तो मान को आसन्न मान पर समायोजित किया जाएगा ।

उदाहरण के लिए, अगर आज है 2014-09-30, तो

var dt = new Date();
dt.setFullYear(2014); /* Sep 30 2014 */
dt.setMonth(1);       /* Mar 02 2014, see, here the auto adjustment occurs! */
dt.setDate(28);       /* Mar 28 2014 */

इससे बचने के लिए, सीधे कंस्ट्रक्टर का उपयोग करके मान सेट करें।

var dt = new Date(2014, 11, 31);

1
मुझे अभी पता चला है, वास्तव में, लेकिन यह वास्तव में मेरे लिए मायने नहीं
रखता है

15
@ user2859409 यह शायद इसलिए है क्योंकि यदि आप महीने को पहले सेट नहीं करते हैं तो यह चालू माह लेता है और फिर कभी-कभी अगले महीने में लपेट सकता है (नीचे दिए गए जैकब के जवाब के अनुसार)
fbstj

3
मुझे यह अनुशंसा करने में संकोच होगा कि 31 दिनों से कम के महीनों के लिए कोड का पहला ब्लॉक। यदि, उदाहरण के लिए, आप दिनांक को 15 सितंबर तक सेट करना चाहते हैं, लेकिन यह आज 31 अगस्त है, तो यह तिथि अगले महीने के आसपास हो जाएगी और आप कोड के दूसरे ब्लॉक के लिए 15 अक्टूबर को समाप्त हो जाएंगे: यह है बेहतर तरीका है। मुझे setMonthअस्तित्व का 2-तर्क रूप भी नहीं पता था।
ल्यूक वुडवर्ड

10
ध्यान दें कि महीने को दिन से पहले सेट करना भी गलत हो सकता है। इस मामले में नहीं, हालांकि। यदि यह 31 अक्टूबर है, तो setMonth (10) दिनांक 31 नवंबर को सेट होगा जो 1 दिसंबर को सेट हो जाएगा।
फ्लोरियन एफ

1
+1 लेकिन मैं इस बात पर जोर दूंगा कि साइड इफेक्ट्स को रोकने के लिए दो महीने का विकल्प पसंद किया जाता है।
ब्रायन

120

बात यह है, जब आप एक दिन पहले सेट करते हैं, तो आप अभी भी चालू माह में हैं, इसलिए सितंबर। सितंबर में केवल 30 दिन हैं:

var dt = new Date(); /* today */
dt.setDate("31"); /* 1st Oct 2014 as should be by spec */
dt.setMonth("11"); /* 1st Dec 2014 */
dt.setFullYear("2014"); /* 1st Dec 2014 */

22
+1 - यह एक प्रकार का बग है जो पूरे अगस्त में निष्क्रिय रहेगा, और फिर आपको बट में आकर
काटेगा

19
यह एक बार में एक तारीख एक घटक सेट करने के लिए सही नहीं है, क्योंकि पहले दिन के साथ और महीने के साथ विफलता के मामले हैं , और संभवतः 2/29 पर वर्ष के साथ। आपको एक ही समय में सभी तीन फ़ील्ड सेट करने होंगे।
जिम गारिसन

5
+1 और यह एक स्वीकृत उत्तर होना चाहिए, क्योंकि यह बताता है कि आपको पहले महीना क्यों निर्धारित करना चाहिए। यह एक बहुत ही जावास्क्रिप्ट है WTF
डेन्यूबियन सेलर

2
अन्य भाषाओं में समान होना चाहिए ताकि "जावास्क्रिप्ट डब्ल्यूटीएफ" न हो।
रेड्री

गलत दिनांक सेट होने पर दिनांक ऑब्जेक्ट क्यों नहीं फेंकता है?
jww

23

यह है क्योंकि पहली बात तुम क्या है

dt.setDate(31)

यह वर्तमान तिथि को 31 पर सेट करता है। वर्तमान माह सितंबर है, जिसमें 30 दिन हैं, इसलिए यह इसे गोल कर रहा है।

यदि आप इस बिंदु के बाद की तारीख का प्रिंट आउट लेते हैं, तो यह 1 अक्टूबर कहेगा।


12
मज़ेदार बात यह है कि यह केवल इसलिए हुआ क्योंकि उसने एक महीने के दौरान इसे 30 दिनों के लिए आज़माया था। एक महीने बाद और यह सिर्फ ठीक काम करने के लिए लग रहा था।
पीटर रिमार्स

13

अपने इरादे को मानते हुए वर्ष, माह और तारीख निर्धारित करना है, साथ ही साथ आप लंबे समय तक निर्माणकर्ता का उपयोग कर सकते हैं :

नई तिथि (वर्ष, माह, दिन, घंटा, मिनट, दूसरा, मिलीसेकंड);

[...]

यदि कम से कम दो तर्कों की आपूर्ति की जाती है, तो लापता तर्क या तो 1 पर सेट होता है (यदि दिन याद आ रहा है) या अन्य सभी के लिए 0।

तो आप लिखेंगे:

var dt = new Date(2014, 11, 31);

जैसा कि पहले से ही स्थापित किया गया है, एक बार में तारीख के एक हिस्से को सेट करने से परिणाम अधिक हो सकता है:

var dt = new Date(2012, 1, 29); // Feb 29 2012
dt.setFullYear(2014);           // Mar 01 2014 instead of Feb 28 2014

इसके अलावा, तारीख से पहले महीने की स्थापना अभी भी अप्रत्याशित अतिप्रवाह का कारण बन सकती है (उत्तर जो तरीकों के क्रम को बदलने की सलाह देते हैं वे गलत हैं):

var dt = new Date(2014, 0, 31); // Jan 31 2014
dt.setFullYear(2014);           // Jan 31 2014
dt.setMonth(1);                 // Mar 03 2014 instead of Feb 28 2014
dt.setDate(1);                  // Mar 01 2014

मुझे यह उत्तर पसंद है, क्योंकि यह आपको शीर्ष पर सही समाधान देता है, फिर समझाता है कि टूटा हुआ समाधान काम क्यों नहीं करता है ...
किप

7

व्यवहार का कारण और इससे कैसे बचा जाए, इसके बारे में विस्तार से बताया गया है।

लेकिन आपके कोड में असली त्रुटि यह है कि आपको डिफ़ॉल्ट कंस्ट्रक्टर का उपयोग नहीं करना चाहिए: नई तिथि ()। आपके कोड का परिणाम मौजूदा समय के साथ 13 दिसंबर को होगा। मुझे संदेह है कि आप क्या चाहते हैं। आपको दिनांक निर्माणकर्ता का उपयोग करना चाहिए जो पैरामीटर के रूप में वर्ष, महीने और दिन लेता है।


1
मुझे लगता है कि यह स्वीकृत उत्तर पर टिप्पणी करने का इरादा था?
डेन्यूबियन सेलर

ज़रुरी नहीं। यह प्रश्न का उत्तर है "मैंने क्या गलत किया?"
फ्लोरियन एफ

-1

उत्तरों ने स्पष्ट किया कि तिथि निर्धारित करने का सही क्रम है:

  • सेटफिलियर ()
  • सेटमार्ट ()
  • तारीख सेट करें()

मैं सिर्फ यह बताना चाहता हूं कि 29 की वजह से सबसे पहले साल को निर्धारित करना महत्वपूर्ण है।


1
नहीं। आदेश यह गारंटी नहीं देता है कि तारीख सही ढंग से सेट की जाएगी। स्वीकृत और सर्वाधिक मत वाले उत्तरों के नीचे टिप्पणियां देखें।
सलमान ए

1
यदि आपकी शुरुआती तारीख 31 वीं है और आप इसे कम (जैसे 30) दिनों के साथ निर्धारित करते हैं, तो आप अगले महीने में समाप्त हो जाएंगे। तो यह सिर्फ पर्याप्त नहीं है। सुरक्षित रहने के लिए आपको महीने निर्धारित करने से पहले तारीख को 28 से अधिक नहीं होना चाहिए। और अंत में तारीख को फिर से उसके अंतिम मूल्य पर सेट करें, अगर यह अधिक है।
bart

-3
var dt = new Date();
dt.setFullYear(2014);
dt.setMonth(11);
dt.setDate(31);

पूर्णांक के रूप में पास मान स्ट्रिंग नहीं .. यह यू सही मान लौटाएगा ।।


अद्यतन - उपरोक्त विवरण सही नहीं है .. मुख्य मुद्दा यह था कि आपको इन तीनों लाइनों को उचित अनुक्रम में रखने की आवश्यकता थी .. फिर भी मैंने अनुक्रम को सही करने के बाद विवरण को सही करना भूल गया ..: P


नहीं, यह नहीं है, यहाँ क्रोम कंसोल में मेरा परीक्षण है: var dt = new Date (); अपरिभाषित dt.setDate (31); 1412157761255 dt.setMonth (11); 1417431761255 dt.setFullYear (2014); 1417431761255 dt सोम दिसंबर 01 2014 12:02:41 GMT + 0100 (पेरिस, मैड्रिड)
user2859409

6
यह तर्क के प्रकार और अनुक्रम के साथ सब कुछ करने के लिए कुछ भी नहीं है। आप अनुक्रम का उल्लेख कर रहे हैं जैसे कि यह एक गौण बात थी ...
dee-

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