2017-04-19 61 views
3

在調試我的申請,我發現奇怪的事情:javascript日期有所不同基於每月格式

new Date('2017-5-19') -> Fri May 19 2017 00:00:00 GMT+0300 (FLE Summer Time) 
new Date('2017-05-19') -> Fri May 19 2017 03:00:00 GMT+0300 (FLE Summer Time) 

我設定的日期從字符串,如'2017-5-19',但是當有前一個月零號,日期比不等於零。

如何通過505輸入實現相同的結果?

p.s.我必須支持嚴格模式

+0

根據該現有的日期邏輯,似乎如果你違反它所期望的格式它不會將您的utc的值轉換爲您的本地時區。所以'2017-05-19'是正確的格式'yyyy-mm-dd'轉換爲您當地的時區。這有幫助嗎? –

+0

@ PansulBhatt - 根據[* ECMA-262 *](http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date-time-string-format),日期爲格式YYYY-MM-DD應該被視爲UTC,而不是本地(當然,並非所有使用的瀏覽器都這樣做)。 – RobG

回答

3

MDN所示,由於實現差異,不鼓勵使用Date構造函數解析日期。

但是,如果您確實想這樣做,唯一的解決方案是確保您提供的輸入是一致的。這將確保(至少在單一環境中)輸出將保持一致。

有像2017-5-19都工作:

function adjustDateString(str) { 
 
    return str.split('-').map(Number).join('-'); 
 
} 
 

 
console.log(new Date(adjustDateString('2017-5-19'))) 
 
console.log(new Date(adjustDateString('2017-05-19')))

有像2017-05-19都工作:

function padTo2Digits(str) { 
 
    return str.length >= 2 ? str : '0' + str; 
 
} 
 

 
function adjustDateString(str) { 
 
    return str.split('-').map(padTo2Digits).join('-'); 
 
} 
 

 
console.log(new Date(adjustDateString('2017-5-19'))) 
 
console.log(new Date(adjustDateString('2017-05-19')))

編輯:但是,正如我上面指出的那樣,您可能會更好,因爲不使用字符串上的Date構造函數。只是它拆分成它的值,並通過那些進入構造:

function parseDate(str) { 
 
    var parts = str.split('-').map(Number); 
 

 
    return new Date(parts[0], parts[1], parts[2]); 
 
} 
 

 
console.log(parseDate('2017-5-19')); 
 
console.log(parseDate('2017-05-19'));

使用陣列deconstructuring語法(需要ES6 +):

function parseDate(str) { 
 
    let [year, month, day] = str.split('-').map(Number); 
 

 
    return new Date(year, month, day); 
 
} 
 

 
console.log(parseDate('2017-5-19')); 
 
console.log(parseDate('2017-05-19'));

+0

非常感謝! – vladdihoney

+0

仍試圖找出將字符串解析爲值的邏輯,然後爲另一個解析器創建另一個字符串進行解析。爲什麼不解析它**一次**並直接將值賦給Date構造函數?注意你的第一句話:「*使用Date構造函數來解析日期不鼓勵*」。 ;-) – RobG

+0

@RobG公平點。我已經添加了一個附錄。 – JLRishe