簡體   English   中英

為什么 moment(date).isValid() 返回錯誤的結果

[英]Why moment(date).isValid() returns wrong result

當我檢查以下日期時,它返回真實結果,為什么?

const value = "3";
if (moment(new Date(value), "DD-MM-YYYY HH:mm", true).isValid())  // true
{ }

或者

const value = "3";
if (moment(new Date(value)).isValid())  // true
{ }

那是因為new Date("3")是有效日期並且

 console.log(new Date("3"))

這是表明您需要清理日期字符串並且不應依賴本機解析器的情況之一,除非您確定您的字符串已經過驗證並且符合要求。

ECMA-262 日期(值)構造函數規范
日期解析

如果字符串不符合該格式,則 function 可能會退回到任何特定於實現的啟發式或特定於實現的日期格式。

所以它不符合"Date Time String Format" ,它要求字符串以 "YYYY" 開頭,所以它會進行類似於上述規則的特定於實現的解析,但使用形式:"MM-DD- YYYY”。

使用嚴格模式(將 moment() 的第三個參數設置為 true)的目的是讓 moment 進行字符串解析並確定它是否符合您提供的格式(例如避免像這樣的意外解析行為)。 如果您使用 Date() 進行解析,則不再使用 moment 的嚴格模式來驗證字符串是否符合您所需的格式。

 let value = "3"; function checkDate(value){ console.log(value, moment(value, "DD-MM-YYYY HH:mm", true).isValid()? 'valid': 'invalid') } value = "01-01-2011 11:22" checkDate(value) value = "01-01-2011 11:22Z" checkDate(value) value = "3" checkDate(value) value = new Date("3").toString() checkDate(value) value = new Date('INVALID DATE') checkDate(value)
 <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.25.3/moment-with-locales.min.js" integrity="sha256-8d6kI5cQEwofkZmaPTRbKgyD70GN5mDpTYNP9YWhTlI=" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.28/moment-timezone-with-data.js" integrity="sha256-O1PdKrSbpAYWSBteb7yX/CMmHhu3US31mtCbsryGwaY=" crossorigin="anonymous"></script>

如果您不需要驗證日期字符串(例如為了防止意外的解析行為),不需要擔心非現代瀏覽器,並且真的只需要將符合的日期字符串和格式解析為基本字符串格式,您可以將本機Date()Intl.DateTimeFormatDate.prototype.toLocaleString 一起使用
TL;DR 您現在使用它的方式意味着您實際上並不需要時間

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM