新的 Date() 函数和 moment() 不检测以字符开头和以数字结尾的输入,例如 'abc 12' 作为无效日期

new Date() function and moment() do not detect inputs with characters at the beginning and ending with numbers such as 'abc 12' as an invalid date

我期待一个检查给定字符串是否为日期的功能;鉴于我可能有一个包含数字的字符串,而不仅仅是其中的字符串。

输入是

'abc 12'

我们知道 'abc 12' 还不是有效的日期字符串,new Date() 和 moment 将其视为有效的日期字符串并给出输出。

new Date('abc 12')

预期输出 -

Invalid Date

实际输出-

Sat Dec 01 2001 00:00:00 GMT+0530 (India Standard Time)

我也试过用moment

var moment = require("moment");
var currentDate = moment('abc 123').toString()
document.getElementById("app").innerHTML = currentDate;

预期输出 -

Invalid date

实际输出-

Fri Jan 01 0123 00:00:00 GMT+0600

HTML5 <input type='date' /> 似乎可以规避这个问题。此外,还有很多来自 jQuery 的日期选择器插件:https://www.vandelaydesign.com/30-best-free-jquery-plugins/

然后,如果您想自己滚动,可以使用这样的输入掩码:https://github.com/RobinHerbots/Inputmask

这一切的重点 - 强制用户使用可读格式。

如果您只是检查某处的字符串以查找可能的日期,您仍然需要猜测要检查的格式。因此,最好强制用户以您想要的格式输入日期。

可以在moment中设置一个strict mode,这将识别解析错误并将moment对象设置为Invalid Date。我在这里留下一些例子:

const strangeString = 'abc 123'; // You date with problem
const now = moment().format(); // Real date

const nowNoStrict = moment(now);
const nowStrict = moment(now, true);
const strangeStringNoStrict = moment(strangeString);
const strangeStringStrict = moment(strangeString, true);

document.getElementById("nowNoStrict").innerHTML = nowNoStrict.format();
document.getElementById("nowStrict").innerHTML = nowStrict.format();
document.getElementById("strangeStringNoStrict").innerHTML = strangeStringNoStrict.format();
document.getElementById("strangeStringStrict").innerHTML = strangeStringStrict.format();
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

<table>
  <tr>
    <td>Now string without use strict mode of moment </td>
    <td id="nowNoStrict"></td>
  </tr>
  <tr>
    <td>Now string with use strict mode of moment: </td>
    <td id="nowStrict"></td>
  </tr>
  <tr>
    <td>Your strange string whitout strict mode of moment: </td>
    <td id="strangeStringNoStrict"></td>
  </tr>
  <tr>
    <td>Your strange string whit strict mode of moment: </td>
    <td id="strangeStringStrict"></td>
  </tr>
</table>

要使用 strict mode,只需将第二个值作为布尔值传递给 moment 构造函数(true 即可使用)。

var currentDate = moment('abc 123', true);
document.getElementById("app").innerHTML = currentDate.format();
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<div id="app"><div>

你的代码变成

如果我错了请纠正我。看起来您正在从网页(前端)获取输入

如果您发现很难在后端进行日期时间检查,我建议您使用像 react-day-picker 这样的日期选择器插件,如果您的前端是这样的话!

如果有人面临同样的问题,在我的例子中,我从一个节点服务器得到了一个 API 响应,它有一个字符串作为响应。该字符串包含 ISO 格式的日期或其中的任何其他内容。假设您仅获得字符串 ISO 格式内的日期。解决方法如下

moment('abc 12', moment.ISO_8601, true).isValid()

输出-

False

P S 学分:我的朋友帮忙做的,他不想写答案,这就是我写的原因。