1 回答

TA貢獻1859條經驗 獲得超6個贊
只是為了鞏固我的發(fā)現,因為它們在評論中,其他人可能難以閱讀或找到:
Chromium 引擎似乎為
Date.parse('COVINGTONOFFICE-2')
和返回相同的結果Date.parse('2')
。它們都返回從 21 世紀初開始計算的月份,即2
給您 2001 年 2 月 1 日。這僅適用于12
:任何超出該數字的數字均無效。Date.parse('COVINGTONOFFICE-2')
返回我測試過的其他瀏覽器的無效日期
Chromium 的 V8 引擎有一些內部啟發(fā)式方法,可以確定如何解析看起來像日期的字符串:并盡最大努力嘗試猜測它。對于其他瀏覽器,他們干脆放棄了。
這符合建議,Date.parse()
應避免使用。通過擴展,它甚至不應該用于模棱兩可或看起來不像日期的字符串。正如MDN 文檔所指出的,瀏覽器有不同的內部啟發(fā)式/實現來執(zhí)行解析:
不同主機解析日期字符串的方式仍然存在許多差異,因此應該手動解析日期字符串(如果要適應許多不同的格式,庫可以提供幫助)。
我已經編譯了一個快速的 ASCII 表來顯示我到目前為止的發(fā)現:
+---------------------------------+--------------------+---------+-----------------+---------+---------------------+
| Browser | Chrome/Brave/Opera | Firefox | Safari | IE11 | Edge (non-Chromium) |
+---------------------------------+--------------------+---------+-----------------+---------+---------------------+
| Date.parse('COVINGTONOFFICE-2') | Thu Feb 01 2001 | Invalid | Invalid | Invalid | Invalid |
| Date.parse('2') | Thu Feb 01 2001 | Invalid | Tue Jan 01 0002 | Invalid | Invalid |
| Date.parse(2) | Thu Jan 01 1970 | NaN | Thu Jan 01 1970 | NaN | NaN |
+---------------------------------+--------------------+---------+-----------------+---------+---------------------+
作為對您的附加問題的回答:我認為您使用本機日期解析器面臨的問題與 Moment.jsmoment(...)解析器相同。兩者都相當寬容,因此它們可能會'COVINGTONOFFICE-2'根據瀏覽器實現解釋為有效字符串。
Moment.js 確實提供了手動指定日期字符串格式的可能性,但它不支持以語言環(huán)境格式(即,...)表示一天中的任何一周的Mon任何Tue標記Wed。您可以實現的最接近的是指定LLLL格式:它似乎適用于使用以下new Date().toString()方法打印出的日期:
// true
console.log(moment('Mon Nov 26 2018 18:03:33 GMT-0500 (Eastern Standard Time)', 'LLLL').isValid());
// false
console.log(moment('COVINGTONOFFICE-2', 'LLLL').isValid());
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment.min.js"></script>
這對我來說越來越像一個 XY 問題:你必須將字符串解析為日期嗎?沒有其他方法可以檢索 ISO 有效的日期格式嗎?
添加回答
舉報