2016-02-16 10 views
8

मेरे पास 2 फ़ील्ड इनपुट और आउटपुट तिथियां हैं। कुछ स्थितियों पर मैंने एंड डेट को प्रारंभ तिथि से 1 वर्ष आगे सेट किया है।इनपुट प्रकार दिनांक बग का सेट मान

<input type='date' id='endDate'> 
$("#startDate").change(function(){ 
    var endDate = new Date($("#startDate").val()); 
    endDate.setMonth(endDate.getMonth() + 1); 
    endDate.setFullYear(endDate.getFullYear() + 1); 
    var myDay = ("0" + endDate.getDate()).slice(-2); 
    var myMonth = ("0" + endDate.getMonth()).slice(-2); 
    $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay); 
} 

मुद्दा जब मैं 2016/02/29 को आरंभ तिथि निर्धारित मैं निम्नलिखित त्रुटि मिली:

The specified value "2017-02-29" does not conform to the required format, "yyyy-MM-dd".

मैं उम्मीद तिथि() फ़ंक्शन यह की देखभाल करने के । जाहिर है, वे नहीं करते हैं। क्या यह एक बग है?

का एक गुच्छा जोड़ने से कहीं भी तेज़ है यदि कथन?

उत्तर

7

असली समस्या यह है कि आपने getMonth के मान को 1 को जोड़ने के बिना उपयोग किया है। अपने yyyy-MM-dd प्रारूप में 0 पर getMonth शुरू होता है से मूल्य (जनवरी), लेकिन महीने के मूल्यों के साथ 1.

तो शुरू:

var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2); 
// Note -------------^------------------^^^^^ 

कैसे आप, में अवैध स्ट्रिंग, 2017-02-29 साथ समाप्त हो गया है यही कारण है कि का उपयोग कर लेने के बावजूद Date ऑब्जेक्ट, जो वास्तव में यह सुनिश्चित करेगा कि यह आपको केवल वैध तिथियां देता है। Date ऑब्जेक्ट में दिनांक मार्च 2 9, 2 9 फरवरी को नहीं था।

हालांकि:

On certain conditions I set the endDate to be 1 year ahead of start date.

आपका कोड है कि नहीं करता है।यह ही नहीं, एक साल में एक साल और एक महीने जोड़ता है:

endDate.setMonth(endDate.getMonth() + 1);  // <== Changing month 
endDate.setFullYear(endDate.getFullYear() + 1); 

आप सिर्फ एक साल जोड़ने के लिए, उन दो पंक्तियों के पहले निकाल दें। यह स्ट्रिंग बनाने के दौरान getMonth का उपयोग करने के तरीके के साथ संयुक्त रूप से सुधार के साथ संयुक्त रूप से तिथि (संभव माह रोलओवर के साथ) में एक वर्ष जोड़ देगा।

तो:

$("#startDate").change(function(){ 
    var endDate = new Date($("#startDate").val()); 
    endDate.setFullYear(endDate.getFullYear() + 1); 
    var myDay = ("0" + endDate.getDate()).slice(-2); 
    var myMonth = ("0" + (endDate.getMonth() + 1)).slice(-2); 
    $("#endDate").val(endDate.getFullYear() + '-' + myMonth + '-' + myDay); 
}); 
10

The specified value "2017-02-29" does not conform to the required format, "yyyy-MM-dd".

2017-02-29 मान्य दिनांक नहीं है। अगले वर्ष (2017) 29th feb संभव नहीं है।

केवल छलांग साल 29.

के फरवरी माह के बजाय 2016-02-29 प्रयास करें की है।

Is their anyway faster than adding a bunch of if statements?

के बयानों, तो आप अपने सवाल का जवाब देने के लिए यह answer

function leapYear(year) 
{ 
    return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0); 
} 

उपयोग कर सकते हैं, यदि आप "2017/02/29" की तरह स्पष्ट रूप से तिथि निर्धारित तो यह होगा गुच्छा जोड़ने के लिए कोई ज़रूरत नहीं एक त्रुटि फेंक दो।

सिर्फ तिथि वस्तु अपने आप में परिवर्तन करते हैं और द्वारा

$("#endDate").val(endDate.toJSON().slice(0,10)); 

इनपुट करने के लिए उस तारीख वस्तु लागू अब यह अगले महीने के लिए रोलिंग का ध्यान रखना चाहिए।

संपादित करें (टीजे की टिप्पणी के आधार पर)

लीप वर्ष, लोगों को समान रूप से 100 से विभाज्य (लीप वर्ष नहीं किया जाता है) को छोड़कर 4 से हर साल समान रूप से विभाज्य है कि हो लोगों को समान रूप से 400 से विभाज्य को छोड़कर (जो लीप साल हैं)।

+2

तुम मेरे #RESPECT प्राप्त की,) हो सकता है ओ पी की जरूरत है एक 'हालत if' .. – Rayon

+1

लीप वर्ष हर साल कि समान रूप से * लोगों को समान रूप से 100 से विभाज्य को छोड़कर 4 * से विभाज्य है पाए जाते हैं (जो लीप साल नहीं हैं), * * को छोड़कर * 400 तक समान रूप से विभाजित (जो * * लीप वर्ष हैं)। –

+1

हाँ मुझे पता है कि यह छलांग वर्ष का मुद्दा है। लेकिन मेरा सवाल यह है कि, तिथि() फ़ंक्शन का ख्याल रखना नहीं चाहिए? या मुझे इसे मैन्युअल रूप से करना चाहिए? –

संबंधित मुद्दे