2009-12-23 62 views
4

好的,我正在寫一些代碼片段來獲取昨天的ISO日期格式值。奇怪的JavaScript算術行爲(yup ...預計)

代碼:

var dateString = new Date(); 

var yesterday = dateString.getFullYear(); 

    yesterday += "-"+dateString.getMonth()+1; 

    yesterday += "-"+dateString.getDate()-1; 

上面的代碼輸出2009-111-23。顯然不是將dateString.getMonth()當作一個intiger,並且在它的最後加上1。

將「 - 」+放在dateString.getDate()前面是否將getDate()轉換爲字符串?

這項工作得到了預期的結果。

var dateString = new Date(); 

var yesterday = dateString.getFullYear() + "-"; 

    yesterday += dateString.getMonth()+1+ "-"; 

    yesterday += dateString.getDate()-1; 
//yesterday = 2009-12-22 

儘管我並不喜歡它的外觀......不管什麼大不了的。

任何人都可以向我解釋爲什麼JavaScript的行爲是這樣的?有什麼解釋爲什麼發生這種情況?

回答

13

這是關於associativity。 +運算符是左關聯的,所以

"-"+dateString.getMonth() + 1 

是一樣圍繞你想表達

("-"+dateString.getMonth()) + 1 

認沽括號先計算:

"-" + (dateString.getMonth() + 1) 
2

它不起作用。在任何一個月的第一天嘗試一下,你會得到它昨天報告「2009-12-0」。

嘗試這樣:

var mydate = new Date(); 
mydate.setDate(mydate.getDate()-1); 
document.write(mydate.getFullYear() + "-" + (mydate.getMonth()+1) + "-" + mydate.getDate()); 
+0

好的呼叫...我會想出一些東西 - 有效與否。爲什麼它的行爲如此? 你應該發佈這樣的評論中的東西...對嗎? (新的這個網站......不知道這是否是通常的做法) – 2009-12-23 15:05:19

0

是,"-" + dateString.getMonth()強制轉換爲字符串,因爲其中一個參數是一個字符串。那麼當你添加1時,它只是附加到字符串中。這並不奇怪 - 這就是幾乎所有動態類型的語言都會起作用的。

使用括號應該工作:

yesterday += "-"+(dateString.getMonth()+1); 

    yesterday += "-"+(dateString.getDate()-1); 
0
var dateString = new Date(); 

var yesterday = dateString.getFullYear(); 

    yesterday += "-"+String(parseInt(dateString.getMonth())+1); 

    yesterday += "-"+String(parseInt(dateString.getDate())-1); 
0

你明白它正確已經 - 使用Javascript首先計算分配的右側,看到了「 - 」字符,並承諾這一切將是鑄造成一個字符串值。

在你的第一個代碼示例,你可以得到你想要的東西用小括號,以防止過早投,如:

var dateString = new Date(); 
var yesterday = dateString.getFullYear(); 
yesterday += "-" + (dateString.getMonth() + 1); 
yesterday += "-" + (dateString.getDate() - 1); 

當然,你仍然會在那裏你報出的天有一個問題該月爲零 - getDate()不是零索引。 :)

1

簡而言之,JavaScript是弱類型的。這意味着它不會確定var是文本還是數字,直到運行時。因此,操作順序很重要。看起來其他海報已經談到了關聯性。請記住,JavaScript是一種功能性語言,不是面向對象的語言,所以不會像你所知道的那樣投射(儘管我認爲可能有一些實用功能強制JavaScript將某些東西當作一個數字 - 我可以'記住我的頭頂)。

+0

你正在考慮'Number()'。 – 2009-12-23 15:07:38

3

正確的方法來獲取表示「昨天」的日期值是這樣的:

var today = new Date(); 
var yesterday = new Date(today.getTime() - (1000*60*60*24)); 

從那裏你可以得到的利益的價值觀,像yesterday.getDate()

+0

謝謝 - 這是否是本月的第一個月? – 2009-12-23 15:25:25

+0

是的。 你正在做的是從時代開始獲取以「毫秒」表示的「今天」,並減去一天中的毫秒數,並使用Date構造函數爲您完成剩下的工作。這是處理日期算法的好方法,而不是試圖自己處理所有事情。 – 2009-12-23 15:27:34

+0

真棒。非常聰明! +1 – 2009-12-23 18:41:29

0

正如Kieveli提到的,​​這不會在本月的第一天工作。相反,獲得自毫秒爲單位的基本數量,減去一天的價值:

var dateobj = new Date(); 
var yesterdayms = dateobj.valueOf() - (24*60*60*1000); 
var yesterdayobj = new Date(yesterdayms); 
var yesterdaydatestring = yesterdayobj.getFullYear() + "-" 
         + (yesterdayobj.getMonth()+1) + "-" 
         + yesterdayobj.getDate(); 
0

試試這個:

<script type="text/javascript"> 
var d = new Date(); 
document.writeln ("Today: " + d + "<br/>Yesterday:"); 
d.setDate(d.getDate()-1); 
document.writeln (d); 
</script> 

編輯

或者這樣:

<script type="text/javascript"> 
var d = new Date(); 
document.writeln ("Today: " + (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear()); 
d.setDate(d.getDate()-1); 
document.writeln ("<br/>Yesterday: " + (d.getDate()+1) + "-" + (d.getMonth()+1) + "-" + d.getFullYear()); 
</script> 
+0

我需要ISO格式:年 - 月 - 日 – 2009-12-23 15:22:58

+0

如果這是本月的第一個月,我認爲這不會正常工作......可能是錯誤的 – 2009-12-23 18:43:00

0

它會更直接地得到昨天的日期方法,而不是從今天的日期減去這些值。

var d = new Date(); 
d.setDate(d.getDate()-1); //yesterday 
var isodatestring= [d.getUTCFullYear(), 
d.getUTCMonth(),d.getUTCDate()].join('-');