2014-10-31 21 views
1

將日期轉換爲字符串和字符串爲日期時,在JavaScript中獲得一些不一致的結果。正如評論中所指出的,這段代碼似乎很奇怪:日期轉換拼圖

// Start with a string literal   
var s1 = "10/31/2014"; 

// Convert string to date 
var f1 = s1.split("/"); 
var d1 = new Date(f1[2], (f1[0] - 1), f1[1]); 
alert("Date from string: " + d1); // works 

// Convert that date to a string 
a1 = (d1.toLocaleString("en-US")).split(" ", 1); 
alert("Array[0] from split: " + a1[0]); // works 
s2 = a1[0]; 
alert("String from Array[0] assignment: " + s2); 

// Convert string to date (identical to before) 
var f2 = s2.split("/"); 
var d2 = new Date(f2[2], (f2[0] - 1), f2[1]); 
alert("Date from String: " + d2); // fails: "Invalid date" 

任何人都知道爲什麼這個字符串不是字符串?

順便說一句,改變

s2 = a1[0]; 

s2 = a1[0].toString(); 

,而可以預見改變不了什麼。想法?

http://jsfiddle.net/pfvh6fed/1/

回答

0

你已經得到了你一年字符串末尾一個逗號,加入.replace(',','')固定的問題

// Start with a string literal   
var s1 = "10/31/2014"; 

// Convert string to date 
var f1 = s1.split("/"); 
var d1 = new Date(f1[2], (f1[0] - 1), f1[1]); 
alert("Date from string: " + d1); // works 

// Convert that date to a string 
a1 = (d1.toLocaleString("en-US")).split(" ", 1); 
alert("Array[0] from split: " + a1[0]); // works 
s2 = a1[0]; 
alert("String from Array[0] assignment: " + s2); 

// Convert string to date (identical to before) 
var f2 = s2.split("/"); 
var d2 = new Date(f2[2].replace(",",""), (f2[0] - 1), f2[1]); 
alert("Date from String: " + d2); // ? 
+0

我在Chrome上運行它,你100%正確。 Chrome在2014年後返回逗號,而IE沒有。奇怪的是,這不是bug。在IE上試用它,它沒有逗號,它仍然不起作用。我可能會漏掉一些明顯的東西,但我認爲它應該像IE一樣沒有逗號。 – Samene 2014-11-01 00:14:59

+0

好的,經過很多調試,我確定IE中有一個bug。當您製作數據字符串時,出於某種原因,在此處指出日期中每個數字的任一側。 '* 14 */* 08 */* 2014 *'有一個char code爲'8206'的幻影字符。這個字符搞砸了IE的parseInt()函數,這是字符串到日期轉換的一部分。你給它一個字符串,它會嘗試創建一個int,但由於這兩個字符而失敗。這可以通過正則表達式替換來解決,但最好用@ Jofre的答案。 – MarshallOfSound 2014-11-01 01:04:09

+0

這可以通過提醒日期字符串'a1 [0]'的長度來證明,您會看到它比可見的長6個字符。那是因爲IE爲這個愚蠢的理由而設置的6個'phanton'角色。 – MarshallOfSound 2014-11-01 01:05:07

1

如果打印console.log(f2[2]);你會發現,你實際上是在捕獲2014,,與包括逗號。刪除它,它應該正常工作。

編輯:做你正在嘗試什麼是最好的方式,但是,應該是語義方式:

day = date.getDay() 

month = date.getMonth() 

year = date.getFullYear() 
+0

我覺得這個瀏覽器的東西很清楚你說得對,語義方式是唯一可靠的方法。不過,我想知道在IE上運行時(我的代碼在LocaleString中沒有逗號)什麼是錯的。 – Samene 2014-11-01 00:19:05