【问题标题】:new Date() producing valid date from invalid input string [duplicate]new Date() 从无效输入字符串生成有效日期 [重复]
【发布时间】:2020-03-24 23:47:20
【问题描述】:

当我在 new Date() 中通过“test 2”字符串时,我得到了一个实际的日期,如何?

我正在尝试是否是约会。

console.log(new Date("test 2"));

【问题讨论】:

  • 你在哪里测试过这个?如果我尝试var date=new Date( "test 2"); console.log(date);,我会得到Invalid Date
  • @obscure 你的示例代码在 Chrome 中适用于我 -> Thu Feb 01 2001 00:00:00 GMT+0000 (Greenwich Mean Time)
  • 我在 chrome 上试过
  • 是否有任何只有一个数字字符的有效日期?我什么都想不出来。当然,这样一个微不足道的测试会拒绝你的测试字符串,但你需要一些更强大的东西。 :(

标签: javascript


【解决方案1】:

因为您的测试文本包含一个数字。看,它把 1 解释为一月,2 解释为二月,3 解释为三月,等等。

new Date( "3")

会给你

Thu Mar 01 2001 00:00:00 GMT+0530 (India Standard Time)

如果您使用没有数字的文本,例如new Date("test") 会抛出无效日期。

【讨论】:

  • 我们期待解释。请参阅上面的答案。
【解决方案2】:

将字符串传递给new Date 与使用Date.parse 相同。

当传递一个非标准的日期字符串时,结果是依赖于实现的;浏览器可以为所欲为,包括猜测。在 Chrome 上,您的输入会产生日期,但在 Firefox 上不会(返回NaN)。

test 不是日期字符串的一部分,所以看起来 Chrome 只是解析 2:

console.log(new Date('2'));
console.log(new Date('1'));
console.log(new Date('0'));

本质上,这是未定义的行为,所以奇怪的结果并不令人惊讶。除非传递的字符串符合format defined in the specification - 即类似于"2011-10-10""2011-10-10T14:48:00""2011-10-10T14:48:00.000+09:00",否则结果是不可预测的。

请考虑找出您期望输入的字符串格式,然后检查该格式是否后跟正则表达式。如果是这样,请传递给new Date,看看它是否会给您带来有意义的结果;否则,不要。

【讨论】:

    【解决方案3】:

    来自mdn

    一个字符串,表示 ISO 8601 日历日期扩展格式的简化(可以使用其他格式,但结果取决于实现)。

    您遇到了将字符串解析为日期的特定于实现的尝试。不建议依赖这种行为。

    【讨论】:

      【解决方案4】:

      根据MDN

      ECMAScript 规范规定:如果字符串不符合标准格式,则函数可能会退回到任何特定于实现的启发式或特定于实现的解析算法。

      Google Chrome 会尝试解析您的日期并将该数字作为月份。其他浏览器可能会拒绝传递的值或返回完全不同的东西。

      因此请考虑以下注意事项:

      由于浏览器的差异和不一致,强烈建议不要使用 Date 构造函数(和 Date.parse(),其工作方式相同)解析日期字符串。

      MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#Parameters

      【讨论】:

        猜你喜欢
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-06
        • 2011-09-05
        • 1970-01-01
        相关资源
        最近更新 更多