2011-05-31 15 views
7

मैं इस स्क्रिप्ट यहाँ स्थित उपयोग कर रहा हूँ के लिए गलत मान लौटने: http://www.javascriptkit.com/script/script2/dyndateselector.shtmlजावास्क्रिप्ट getDay अप्रैल, जून, सितंबर, नवंबर

आप इसे करने की कोशिश, और अप्रैल, जून, सितंबर या नवंबर के किसी भी करने के लिए, आप करेंगे जाते हैं ध्यान दें कि सप्ताह के कॉलम का दिन गलत है। यहाँ गलत डेटा की एक सूची है (एक्स शुरू होता है y सामान दिखा रहा है अगले महीने।)

Bugged महीने: 4/अप्रैल (शुरू होता है रविवार के बजाय शुक्रवार) मई रविवार

6/जून (शुरू होता है शुरू होता है बुधवार बजाय शुक्रवार) जुलाई शुक्रवार

9/सितंबर (बृहस्पतिवार के बजाय शनिवार से शुरू होता है) अक्टूबर शनिवार

शुरू होता है

11/नवंबर (मंगलवार के बजाय गुरुवार से शुरू होता है) Dece शुरू होता है mber गुरुवार

आप देखेंगे कि प्रत्येक बग महीना अगले महीने के दिन से शुरू हो रहा है, फिर भी अन्य सभी महीनों में सही लगता है।

मुझे इस समस्या पर कुछ भी नहीं मिला। कोई भी मदद करने में सक्षम है? अकेले वास्तविक जावास्क्रिप्ट यहां पाया जा सकता है, और getDay() विधि लाइन 125: http://pastebin.com/0zuBYrzv

पर मैंने फ़ायरफ़ॉक्स और क्रोम दोनों में परीक्षण किया है।

यहाँ मुद्दा प्रदर्शित करने के लिए कुछ बहुत ही सरल कोड है:

<script> 
var d = new Date(); 
d.setMonth(5); 
d.setFullYear(2011); 
d.setDate(1); 
alert(d.getDay()); 
</script> 

यह संदेश "5" के साथ एक चेतावनी पैदा करेगा, शुक्रवार अर्थ (5 + 1 = 6, शुक्रवार को सप्ताह के 6 दिन है ,) वास्तव में बुधवार सप्ताह की शुरुआत है।

+0

कृपया ध्यान दें कि जब मैं 4/अप्रैल का उपयोग करता हूं, तो इसे ध्यान में रखा जाता है, और यदि आप Ctrl + F स्क्रिप्ट देखेंगे तो आप देखेंगे (एम -1), इसलिए यह बदल जाता है 3. –

उत्तर

8

यह वास्तव में बहुत दिलचस्प है के रूप में मैं अनुमान लगा रहा हूँ कि कल अपने मूल कोड आप फिर से चाहते हैं के रूप में काम करेंगे।

मुझे लगता है कि क्या हो रहा है यह है कि आप एक नया Date बना रहे हैं और यह स्वचालित रूप से आज (31 मई) को प्रारंभ कर देगा। फिर आप महीना जून को सेट करते हैं जिसके द्वारा आप मूल रूप से इसे 31 जून बनाते हैं। यह तिथि मौजूद नहीं है इसलिए जावास्क्रिप्ट इसे 1 जुलाई में बदल देगा। अंत में आप तिथि निर्धारित करते हैं लेकिन चूंकि आपका महीना अब और नहीं है जो आप चाहते हैं कि परिणाम गलत हों।

+0

ओह, मैं समझता हूँ! यह सत्यापित है कि यदि मैं दिन, महीना, वर्ष निर्धारित करता हूं, तो यह सही तरीके से काम करता है। –

4

ऐसा लगता है कि 0 जनवरी है और 11 दिसंबर है।

+0

ऐसा इसलिए है क्योंकि जावास्क्रिप्ट माह और दिन है शून्य-आधारित, एक-आधारित नहीं। –

1

स्पष्ट रूप से जावास्क्रिप्ट इसे पसंद नहीं करता अगर मैं महीने, पूर्ण वर्ष, फिर दिन सेट करता हूं। मुझे क्या करना चाहिए उन सभी को एक समारोह में सेट है, इसलिए जैसे:

<script> 
var d = new Date(); 
d.setFullYear(2011, 5, 1); 
alert(d.getDay()); 
</script> 
+1

मुझे लगता है कि यह 'डेट' ऑब्जेक्ट की' दिनांक' संपत्ति के लिए कैसे सेटर फ़ंक्शन के साथ कार्य करना है। ऐसा लगता है कि 'setFullYear' के 3 तर्क संस्करण को उन सभी तिथियों को ध्यान में रखा जाता है जिन्हें बदलने की आवश्यकता है, लेकिन' setDate' नहीं है। बहुत ही रोचक। – Pat

+0

setFullYear उन्हें उचित क्रम में सेट करता है: दिन, महीना, वर्ष; वर्ष, दिन, महीना; महीना दिन वर्ष; या दिन, वर्ष, महीने। –

0

मुझे लगता है कि यह जावास्क्रिप्ट की दिनांक वस्तु में एक बग है। कृपया निम्नलिखित कोड देखें। (मैं इसे देखने के लिए w3school's JSref tool ऑनलाइन का उपयोग कर रहा हूं।) कृपया ध्यान दें, नीचे दिए गए तरीकों को w3 schools themselves द्वारा बताया गया है।

एक तारीख instantiating के कुछ उदाहरण:

वर आज = ​​new Date()
वर d1 = new Date ("13 अक्टूबर, 1975 11:13:00")
वर d2 = नई तारीख (79,5,24) (गलत // यह वह जगह है - अप्रत्याशित परिणाम !!!)
वर d3 = new Date (79,5,24,11,33,0)

तो कृपया इस दिनांक वस्तु का उपयोग करते समय सावधान रहें, ली दिखता है तत्काल तारीखों के कुछ निश्चित तरीके दूसरों की तुलना में बेहतर हैं।

<script type="text/javascript"> 

function whatDayIsToday(date) 
{ 
var weekday=new Array(7); 
weekday[0]="Sunday"; 
weekday[1]="Monday"; 
weekday[2]="Tuesday"; 
weekday[3]="Wednesday"; 
weekday[4]="Thursday"; 
weekday[5]="Friday"; 
weekday[6]="Saturday"; 

document.write("Today is " + weekday[date.getDay()] + ", <br />"); 
document.write("the " + date.getDay() + getSuffix(date.getDay()) + " day of the week. <br /><br />") 
} 
function getSuffix(num) 
{ 
return (num>3)?"th":(num==3)?"rd":(num==2)?"nd":(num==1)?"st":""; 
} 

//CORRECT 
var d3 = new Date("01/01/2011"); 
whatDayIsToday(d3); 

//CORRECT 
var d2 = new Date("01/01/2011"); 
whatDayIsToday(d2); 

//DOESN'T WORK 
var d5 = new Date("1-1-2011"); 
whatDayIsToday(d5); 

//WRONG 
var d4 = new Date("2011", "01", "01"); 
whatDayIsToday(d4); 

//DAY OF WEEK IS WRONG 
var d = new Date(2011, 1, 1); 
whatDayIsToday(d); 

//DAY OF WEEK IS ALSO WRONG 
var d0 = new Date(11, 1, 1); 
whatDayIsToday(d0); 

</script> 

आउटपुट (सभी 1/1/2011 से कुछ प्रारूप का उपयोग कर रहे हैं):

 
Today is Saturday, 
the 6th day of the week. (CORRECT, January first this year was a saturday) 

Today is Saturday, 
the 6nd day of the week. (CORRECT) 

Today is undefined, 
the NaNnd day of the week. (WRONG FORMATTING, DOESN'T WORK - EXPECTED) 

Today is Tuesday, 
the 2nd day of the week. (WRONG - UNEXPECTED) 

Today is Tuesday, 
the 2nd day of the week. (WRONG - UNEXPECTED) 

Today is Wednesday, 
the 3nd day of the week. (WRONG - UNEXPECTED) 

इस सवाल का अन्य उत्तर के आधार पर, मेरा अनुमान है कि यह दिन मैं के साथ क्या करना है वर्तमान में (8/26/2011) - यह मेरी शुरुआती नई तिथि() और गलत क्रम में लागू होने वाले दिन और/या वर्ष लागू हो जाएगा। हालांकि, यह सुनिश्चित होगा कि if this thing worked अच्छा होगा!

var days = ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"]; 
var d = new Date(); 
d.setFullYear(selectYear.options[selectYear.selectedIndex].value); 
d.setMonth(selectMonth.options[selectMonth.selectedIndex].value-1); 
d.setDate(selectDay.options[selectDay.selectedIndex].value); 
alert(days[d.getDay()]); 

यह समय के सबसे अधिक काम करेगा:

-1

यह विशिष्ट गलत दृष्टिकोण है। लेकिन जब वर्तमान तिथि 31 है और 31 दिनों से कम समय के साथ एक महीने में सेट होने के लिए 31 तारीख निर्धारित करने का प्रयास करते समय इसमें समस्या होगी।

यह एक अच्छा तरीका है:

var days = ["Söndag", "Måndag", "Tisdag", "Onsdag", "Torsdag", "Fredag", "Lördag"]; 
var d = new Date(0); // solves all problems for existing dates 
d.setFullYear(selectYear.options[selectYear.selectedIndex].value); 
d.setMonth(selectMonth.options[selectMonth.selectedIndex].value-1); 
d.setDate(selectDay.options[selectDay.selectedIndex].value); 
if(d.getDate() == selectDay.options[selectDay.selectedIndex].value) { 
    alert(days[d.getDay()]); 
} 
else { 
    alert("this date doesn't exist"); // date was changed cuz date didn't exist 
} 

new Date(0) साथ तारीख का निर्माण 1 जनवरी की तारीख तय करता है, यह अच्छा है क्योंकि तिथि 31 नहीं है और जनवरी 31 दिनों जो हमें अंतरिक्ष हम आवश्यकता है । यह 31 वें में विफल नहीं होगा और हमें डेटा को किसी भी विशेष क्रम में सेट करने की आवश्यकता नहीं है। यह हमेशा काम करेगा।

यदि उपयोगकर्ता सितंबर (30 दिन) और 31 तक की तारीख को सेट करता है तो डेटा ऑब्जेक्ट या तो 1 ऑक्ट या 1 सीपी रखेगा (जिस क्रम पर आप उन्हें सेट करते हैं)। जो अप्रासंगिक है क्योंकि वे दोनों गलत हैं। एक साधारण जांच अगर तारीख है जिसे हमने सेट किया है, तो हमें बताएगा कि तारीख एक मौजूदा तारीख है, अगर नहीं तो हम उपयोगकर्ता को यह बता सकते हैं।

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