试图理解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>
有人可以向我解释一下吗?
答案 0 :(得分:1)
当您传递字符串moment
时,检查它是否是有效的日期格式,如果不是,则它会回退到内置的javascript Date.parse()
方法。
moment.js文档说:
在遇到从字符串创建片刻时,我们首先检查字符串 匹配已知的ISO 8601格式,然后检查字符串是否匹配 RFC 2822日期时间格式在退回到新的后退之前 如果找不到已知格式,则为日期(字符串)。
Date.parse
之前, 10
无法识别字符串中有用的内容。剩下的就是它。假定使用默认日期格式,具体取决于您的位置和语言。就我自己而言,在美国,格式为MM/DD
。结果是字符串被解析为10月1日(第10个月,没有指定的日期默认为第1个月)。然后(因为Y2K-ish原因,我怀疑)它假设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 date
) Date
方法。