2017-03-13 39 views
1

嚴格模式下的行爲是否正確,對於格式M/D/YYYY,moment.js將接受01.09.2017?它不應該只接受1.9.2017,如果格式中只有「一個M」?同樣適用於D天。當格式爲M時,moment.js接受兩位數月份「01」

編輯:

moment('1/09/2017', 'MM/D/YYYY', true).isValid() // false 
moment('01/09/2017', 'M/D/YYYY', true).isValid() // true -> why? 

爲什麼M仁者爲01,但MM不是1?這是一個錯誤嗎?

+0

做你的意思是[嚴格模式](https://momentjs.com/guides/#/parsing/strict-mode/)? –

+0

是的,謝謝你的糾正。 – mimo

回答

0

它可能無法正確工作。在你的例子中,它工作正常,但在其他情況下,它可能會產生錯誤的結果。 Moment format doc

moment("01.09.2017", "M/D/YYYY").format("M/D/YYYY"); 
//"1/9/2017" 
moment("02-25-1995", "MMM/D/YY").format("MM/DD/YYYY"); 
//"01/02/2025" 

如果需要指定多種格式,你可以通過設置第二個參數爲字符串格式數組做到這一點。 Moment multiple format

moment("29-06-1995", ["MM-DD-YYYY", "DD-MM", "DD-MM-YYYY"]); // uses the last format 
moment("05-06-1995", ["MM-DD-YYYY", "DD-MM-YYYY"]);   // uses the first format 

對於嚴格模式:這個參數影響到解析數據和編號將正確地工作的正則表達式。

//Non strict regular  
Hb = /\d\d?/ 
//Strict regular 
Sb = /\d\d/ 

d = b._strict; 
case"MM": 
case"DD": 
case"YY": 
case"GG": 
case"gg": 
case"HH": 
case"hh": 
case"mm": 
case"ss": 
case"ww": 
case"WW": 
    return d ? Sb : Hb; 

如果用一個字母總是使用非正規嚴格

case"M": 
case"D": 
case"d": 
case"H": 
case"h": 
case"m": 
case"s": 
case"w": 
case"W": 
case"e": 
case"E": 
    return Hb; 

所以嚴格模式將在情況

moment("1/9/1990", "MM/MD/YYYY", true).format("M/D/YYYY") 
"Invalid date" 

失敗,所有這一切都是在測試版momentjs 2.7.0 在新版本的時刻2.17.1格式嚴格參數使用['MMM', 'MMMM'], ['dd', 'ddd', 'dddd']

+1

@mimo我無法評論你的問題。以同樣的方式,這種情況是一個錯誤,但如果看到更廣泛的話,要更正解析日期和月份,我們需要非嚴格模式下的非strtict來解析大於9>的值。您可以向Momentjs團隊發送有關此情況的錯誤報告 –

+0

這些是來自momentjs存儲庫的正則表達式嗎?我想知道,爲什麼不使用2個不同的正則表達式完全符合嚴格模式。像/ \ d /月/日在10以下和其他數字/ \ d \ d /(如您所寫)。我已經在GitHub上打開了一個問題:https://github.com/moment/moment/issues/3830 – mimo

+0

@mimo它來自我的當前項目中使用的非庫存版本的庫。在他們新版本的momentjs中,他們完全重寫了正則表達式解析邏輯。但他們仍然忽略嚴格模式的日月的一個字母格式。我認爲這是因爲嚴格的檢查會導致性能下降,並使代碼更復雜,更不靈活。 –

相關問題