Thy*_*hys 183 javascript date-format
检查值是否为有效日期,允许使用任何已知日期格式的简单方法是什么.
比如我有值10-11-2009,10/11/2009,2009-11-10T07:00:00+0000它都应该被视为日期值,和值200,10,350,不应被视为一个日期值.如果可能的话,最简单的检查方法是什么?因为时间戳也是允许的.
rsp*_*rsp 221
这是一个老问题,但其他新问题如下:
关闭这个重复,所以我认为在这里添加一些新信息很重要.我正在写它是因为我害怕以为人们实际上复制并粘贴了这里发布的一些代码并在生产中使用它.
这里的大多数答案都使用了一些复杂的正则表达式,这些表达式只匹配一些非常特定的格式,并且实际上做得不正确(比如匹配1月32日,而不像广告中那样匹配实际的ISO日期 - 请参阅演示)或者他们尝试将任何内容传递给Date构造函数和希望最好的.
正如我在这个答案中解释的那样,目前有一个可用的库: Moment.js
它是一个用JavaScript解析,验证,操作和显示日期的库,它具有比标准JavaScript日期处理函数更丰富的API.
它是12kB缩小/ gzip并在Node.js和其他地方工作:
bower install moment --save # bower
npm install moment --save # npm
Install-Package Moment.js # NuGet
spm install moment --save # spm
meteor add momentjs:moment # meteor
Run Code Online (Sandbox Code Playgroud)
使用Moment,您可以非常具体地检查有效日期.有时候添加一些关于你期望的格式的线索是非常重要的.例如,2015年6月22日之类的日期看起来像一个有效的日期,除非您使用格式DD/MM/YYYY,在这种情况下,该日期应被视为无效.您可以通过几种方式告诉Moment您期望的格式,例如:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
Run Code Online (Sandbox Code Playgroud)
该true参数是有那么瞬间将不尝试解析输入,如果它不正好符合所提供的格式之一(它应该是在我看来,一个默认的行为).
您可以使用内部提供的格式:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
Run Code Online (Sandbox Code Playgroud)
您可以使用多种格式作为数组:
var formats = [
moment.ISO_8601,
"MM/DD/YYYY :) HH*mm*ss"
];
moment("2015-06-22T13:17:21+0000", formats, true).isValid(); // true
moment("06/22/2015 :) 13*17*21", formats, true).isValid(); // true
moment("06/22/2015 :( 13*17*21", formats, true).isValid(); // false
Run Code Online (Sandbox Code Playgroud)
见:DEMO.
如果您不想使用Moment.js,还有其他库:
我创建的immoment模块就像是Moment的一部分,但没有因现有对象的变异而引起的惊喜(有关更多信息,请参阅文档).
今天我建议使用Luxon进行日期/时间操作而不是Moment,它(不像Moment)使所有对象都不可变,因此没有与日期的隐式变异相关的令人讨厌的惊喜.
也可以看看:
Rob Gravelle关于JavaScript解析库的一系列文章:
当然,任何人都可以尝试重新发明轮子,写一个正则表达式(但是在你做之前请实际读取ISO 8601和RFC 3339)或者用随机数据调用buit-in构造函数来解析错误消息,如'Invalid Date'(你确定这个消息是在所有平台上完全相同?在所有语言环境中?未来?)或者您可以使用经过测试的解决方案并利用您的时间来改进它,而不是重新发明它.这里列出的所有库都是开源的免费软件.
Nei*_*rdi 61
这就是我现在正在处理的应用程序中解决这个问题的方法:
根据krillgar的反馈更新:
var isDate = function(date) {
return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}
Run Code Online (Sandbox Code Playgroud)
要么...
var isDate = function(date) {
return (new Date(date) !== "Invalid Date" && !isNaN(new Date(date)) ) ? true : false;
}
Run Code Online (Sandbox Code Playgroud)
....
Asm*_*mor 42
就Date.parse()足够了?
请参阅其相关的MDN文档页面.
kri*_*gar 22
new Date(date) === 'Invalid Date'仅适用于Firefox和Chrome.IE8(我在我的机器上用于测试目的)给出了NaN.
正如已接受的答案所述,Date.parse(date)也适用于数字.因此,为了解决这个问题,你还可以检查它不是一个数字(如果这是你要确认的东西).
var parsedDate = Date.parse(date);
// You want to check again for !isNaN(parsedDate) here because Dates can be converted
// to numbers, but a failed Date parse will not.
if (isNaN(date) && !isNaN(parsedDate)) {
/* do your work */
}
Run Code Online (Sandbox Code Playgroud)
lpr*_*hap 10
使用正则表达式来验证它。
isDate('2018-08-01T18:30:00.000Z');
isDate(_date){
const _regExp = new RegExp('^(-?(?:[1-9][0-9]*)?[0-9]{4})-(1[0-2]|0[1-9])-(3[01]|0[1-9]|[12][0-9])T(2[0-3]|[01][0-9]):([0-5][0-9]):([0-5][0-9])(.[0-9]+)?(Z)?$');
return _regExp.test(_date);
}
Run Code Online (Sandbox Code Playgroud)
Yuv*_*til 10
function isDate(dateStr) {
return !isNaN(new Date(dateStr).getDate());
}
Run Code Online (Sandbox Code Playgroud)
这样的事怎么样?它将测试它是Date对象还是日期字符串:
function isDate(value) {
var dateFormat;
if (toString.call(value) === '[object Date]') {
return true;
}
if (typeof value.replace === 'function') {
value.replace(/^\s+|\s+$/gm, '');
}
dateFormat = /(^\d{1,4}[\.|\\/|-]\d{1,2}[\.|\\/|-]\d{1,4})(\s*(?:0?[1-9]:[0-5]|1(?=[012])\d:[0-5])\d\s*[ap]m)?$/;
return dateFormat.test(value);
}
Run Code Online (Sandbox Code Playgroud)
我应该提一下,这不会测试ISO格式化的字符串,但是对RegExp做更多的工作你应该是好的.
此处没有答案可以检查日期是否无效,例如2月31日。此功能通过检查返回的月份是否等于原始月份并确保提供了有效的年份来解决该问题。
//expected input dd/mm/yyyy or dd.mm.yyyy or dd-mm-yyyy
function isValidDate(s) {
var separators = ['\\.', '\\-', '\\/'];
var bits = s.split(new RegExp(separators.join('|'), 'g'));
var d = new Date(bits[2], bits[1] - 1, bits[0]);
return d.getFullYear() == bits[2] && d.getMonth() + 1 == bits[1];
}
Run Code Online (Sandbox Code Playgroud)
小智 7
通过参考以上所有评论,我得出了一个解决方案。
如果Date传递的是 ISO 格式或需要处理其他格式,则此方法有效。
var isISO = "2018-08-01T18:30:00.000Z";
if (new Date(isISO) !== "Invalid Date" && !isNaN(new Date(isISO))) {
if(isISO == new Date(isISO).toISOString()) {
console.log("Valid date");
} else {
console.log("Invalid date");
}
} else {
console.log("Invalid date");
}
Run Code Online (Sandbox Code Playgroud)
你可以在这里玩JSFiddle。
小智 5
我知道这是一个老问题,但我遇到了同样的问题,发现没有一个答案能正常工作——特别是从日期中剔除数字(1,200,345 等),这是最初的问题。这是我能想到的一个相当非正统的方法,它似乎有效。是否有失败的情况请指出。
if(sDate.toString() == parseInt(sDate).toString()) return false;
Run Code Online (Sandbox Code Playgroud)
这是删除数字的行。因此,整个函数可能如下所示:
if(sDate.toString() == parseInt(sDate).toString()) return false;
Run Code Online (Sandbox Code Playgroud)
这是一个仅使用的改进函数Date.parse():
function isDate(s) {
if(isNaN(s) && !isNaN(Date.parse(s)))
return true;
else return false;
}
Run Code Online (Sandbox Code Playgroud)
注意: Date.parse() 将解析数字:例如Date.parse(1)将返回一个日期。所以在这里我们检查是否s不是数字,如果是日期。
| 归档时间: |
|
| 查看次数: |
250208 次 |
| 最近记录: |