2

试图了解 moment.js 如何将字符串转换为日期,我跳入了这个问题。

let date = "User has logged in to more than 10 .";
console.log(moment(date)); //output date

let invalid = "User has logged in to more than 10 a";
console.log(moment(invalid)); //output invalid date
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.13.0/moment.js
"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/2.2.0/moment-range.js"></script>

有人可以向我解释吗?

CodePen 链接

4

1 回答 1

1

当您传递字符串时,moment检查它是否是有效的日期格式,如果不是,则回退到内置的 javascriptDate.parse()方法。

moment.js 文档说:

从字符串创建时刻时,我们首先检查字符串是否与已知的 ISO 8601 格式匹配,然后检查字符串是否与 RFC 2822 日期时间格式匹配,如果已知格式为未找到。

Date.parse在遇到 ; 之前无法识别字符串中的任何有用内容10;它放弃了其余的。采用默认日期格式,这取决于您的位置和语言。在我自己的情况下,在美国,格式是MM/DD. 结果是字符串被解析为 10 月 1 日(第 10 个月,未指定日期默认为 1 日)的日期。然后(出于 Y2K 的原因,我怀疑)假设为 2001 年,因为没有给出年份。

我们从 javascript 的内置Date方法中得到相同的行为:

new Date(Date.parse('User has logged in to more than 10.'))
// Mon Oct 01 2001 00:00:00 GMT-0400 (EDT) <- As printed from Michigan.

在第二种情况下,您尝试使用10 a而不是结束字符串,如果将相同的行为传递给内置方法10 .,您会注意到相同的行为 ( ) 。invalid dateDate

于 2018-05-21T17:21:50.983 回答