2017-02-01 27 views
1
function datecheck(){ 
    var dt1 = new Date(); 
    dt1.setUTCFullYear("2017"); 
    dt1.setUTCDate("1"); 
    dt1.setUTCMonth("1"); 
    alert(dt1.getUTCMonth()); 
} 

當我執行這個函數時,我得到0作爲警報,但如果setUTCMonth(「2」)。我收到2的警報。同樣,如果給出3,4,5,6,7,8 ...,那麼它會在同一個月發出警報,那麼1月份會出現什麼問題?javascript一月發行號

而且我還發現,如果

function datecheck(){ 
    var dt1 = new Date(); 
    dt1.setUTCFullYear("2017"); 
    dt1.setUTCMonth("1"); 
    dt1.setUTCDate("1"); 
    alert(dt1.getUTCMonth()); 
} 

行爲改變時1獲得通過,也開始提醒0。我完全糊塗發生了什麼事...

有誰能告訴我我哪裏出錯了。

在此先感謝。

+1

JavaScript的月份從0到11。不,它沒有意義。不可以,因爲它會破壞向後兼容性。是的,這讓我們瘋狂。 –

+0

幾個月(和幾天和幾年)也是數字,而不是字符串。當你只需要寫'1'時,爲什麼要寫''1''來做額外的工作? –

+2

@JaredSmith我個人喜歡 - '['Jan','Feb','Mar'....] [date.getUTCMonth()]'是一個巧妙的技巧:D –

回答

1

你有幾個問題。首先,突變Date對象的方式是不明智的,除非你真的知道你在做什麼。它更好地將所需的參數傳遞給構造函數:

var jan1 = new Date(2017, 0, 1); 

請注意,我通過了零。這是因爲與其他日期相關的計數不同,JavaScript中的月份從0到11。其次,你忽略了時區的影響。 JavaScript構造本地時區中的Date對象。例如,我現在是格林威治標準時間-5。 如果我做我的瀏覽器的控制檯以下:

var dec31 = new Date(2016, 11, 31, 20); // 20hr == 8pm 
dec31.getMonth(); // 11 
dec31.getUTCMonth(); // 0 

五個小時的偏差推動UTC時間到下個月。

+0

我不確定這是如何回答這個問題的,因爲OP使用所有'[gs] etUTC *'函數...... –

+0

@NiettheDarkAbsol做出了一些基於假設的假設結果依賴於方法被調用的順序。有點像當你看到一些相當複雜的標題和主體的問題,但你幾乎立即知道它是一個「如何從一個異步請求返回結果」只是本能。 –

+0

夠公平! :d –