2011-05-31 64 views
7

我使用這個腳本位於:http://www.javascriptkit.com/script/script2/dyndateselector.shtml的JavaScript getDay返回不正確的值四月,六月,九月,十一月

如果你嘗試它,去任何四月,六月,九月和十一月,你會請注意,星期幾欄不正確。下面是不正確的數據的列表(X啓動Ÿ東西正顯示出下一個月。)

竊聽月: 4 /月(開始週日,而不是星期五) 月開始週日

6月/ 6月(開始週五而不是週三) 七月開始週五

9 /月(週六開始,而不是星期四) 月開始週六

11/11(星期四開始,而不是星期二) DECE mber週四開始

你會注意到,每個被竊聽的月份都是從下個月的一天開始,但其他月份似乎都是正確的。

我在這個問題上找不到任何東西。任何人都可以幫忙?實際的Javascript可以在這裏找到,並且getDay()方法發生在125行:http://pastebin.com/0zuBYrzv

我已經在Firefox和Chrome中進行了測試。

這裏有一些非常簡單的代碼來說明這個問題:

<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/4月,它被考慮到,如果你Ctrl + F的腳本,你會看到(m - 1),所以它變成了3. – 2011-05-31 18:49:08

回答

8

其實,這是非常有趣的,因爲我猜,明天你原來的代碼將作爲你再要。

我認爲正在發生的事情是你正在創建一個新的Date,那會自動初始化到今天(5月31日)。 然後,您將月份設置爲6月份,您基本上認爲它是6月31日。這個日期不存在,所以JavaScript會將它變成7月1日。 最後你設置日期,但因爲你的月份不再是你想要的結果將是錯誤的。

+0

哦,我明白了!這驗證瞭如果我設置日,月,年,它可以正常工作。 – 2011-05-31 22:23:24

4

看起來0月是1月,11月是12月。

+0

這是因爲Javascript月和日是零基礎,而不是一個基礎。 – 2011-05-31 18:48:35

1

顯然JavaScript不喜歡它,如果我設置月份,全年,然後一天。我要做的就是將它們都在同一個功能,像這樣:

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

我在想這與'Date'對象'date'屬性的setter函數有什麼關係。它看起來像'setFullYear'的3參數版本考慮了所有需要改變的日期,但是'setDate'沒有。很有意思。 – Pat 2011-05-31 20:17:31

+0

setFullYear將它們設置爲正確的順序:日,月,年;年,日,月;月日年;或者日,年,月。 – 2011-05-31 22:36:29

0

我認爲這是Javascript日期對象中的一個錯誤。 請看下面的代碼。 (我在線上快速查看w3school's JSref tool)。 請注意,以下所用方法由w3 schools themselves告知。

實例化一個日期的一些例子:今天

VAR =新的日期()
VAR D1 =新的日期( 「1975年10月13日11點13分00秒」)
VAR D2 =新日期(79,5,24)(//這是錯誤的 - 意想不到的結果!)
VAR D3 =新的日期(79,5,24,11,33,0)

所以使用這個Date對象時請小心,看起來li某些實例化日期的方法比其他方法更好。

<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> 

輸出(全部使用的一些2011/1/1格式)是:

 
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

-1

這是典型的錯誤的做法:

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()]); 

它將工作的大部分時間。但是,如果當前日期爲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月1日,因爲日期是不是31號,這是好的,月有31天,這給了我們所需要的空間。它不會在31日失敗,我們不需要以任何特殊順序設置數據。它將始終有效。

如果用戶將月份設置爲九月(30天)並將日期設置爲31,則數據對象將保存1個oct或1 sep(取決於您設置的順序)。這是不相關的,因爲它們都是錯誤的。一個簡單的檢查,如果日期是我們設置它將告訴我們,如果日期是一個現有的日期,如果不是我們可以告訴用戶這一點。