Answers:
就Date.parse()
足够了?
请参阅其相对的MDN文档页面。
Date.parse("4.3")
是986270400000
。
这是一个老问题,但其他新问题如:
作为此副本的副本而被关闭,因此我认为在此处添加一些新信息很重要。我之所以写它,是因为我害怕人们会真正复制并粘贴此处发布的一些代码并在生产中使用它。
此处的大多数答案要么使用一些仅匹配某些非常特定格式的复杂正则表达式,然后实际执行不正确(例如匹配1月32日,而不匹配所宣传的实际ISO日期-参见demo),要么尝试将任何内容传递给Date
构造函数并希望最好。
正如我在此答案中解释的那样,当前有一个可用的库: Moment.js
它是一个用于解析,验证,操作和显示JavaScript中的日期的库,它具有比标准JavaScript日期处理功能丰富的API。
它缩小/压缩了12kB,可在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
使用Moment,您可以非常明确地检查有效日期。有时,添加一些有关所需格式的线索非常重要。例如,日期(例如06/22/2015)看起来像是有效日期,除非您使用DD / MM / YYYY格式,否则在这种情况下,该日期应被视为无效。有几种方法可以告诉Moment您期望什么格式,例如:
moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true
moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false
该true
参数存在,因此,如果矩不完全符合所提供的一种格式,则Moment不会尝试解析输入(我认为这应该是默认行为)。
您可以使用内部提供的格式:
moment("2015-06-22T13:17:21+0000", moment.ISO_8601, true).isValid(); // true
您可以将多种格式用作数组:
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
请参阅:DEMO。
如果您不想使用Moment.js,那么还有其他库:
我创建了类似于 Moment(子集)的immoment模块,但没有因现有对象的突变而引起的意外(有关更多信息,请参阅文档)。
今天,我建议使用Luxon代替Moment 来进行日期/时间操作(与Moment不同),Moment使所有对象不可变,因此不会出现与隐式更改日期有关的令人讨厌的惊喜。
也可以看看:
Rob Gravelle关于JavaScript日期解析库的一系列文章:
当然,任何人都可以尝试重新发明轮子,编写正则表达式(但在执行此操作之前请先阅读ISO 8601和RFC 3339)或使用随机数据调用buit-in构造函数以解析错误消息,例如'Invalid Date'
(确定此消息是在所有平台上都完全相同(在所有语言环境中还是在将来?),或者您可以使用经过测试的解决方案并花费时间来改进它,而不是重新发明它。此处列出的所有库都是开源的免费软件。
moment("whatever 123").isValid()
返回true
。
moment("06/22/2015", "DD/MM/YYYY", true).isValid();
显式提供预期的日期格式,并带有true
表示严格检查的参数。我使用更多信息和更好的示例更新了我的答案。
这就是我现在正在使用的应用程序中解决此问题的方式:
根据来自磷虾的反馈进行了更新:
var isDate = function(date) {
return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date));
}
new Date(date)
不会给您“无效日期”。
new Date(date) !== "Invalid Date"
将始终返回true,因为左表达式将返回一个时间值为NaN的Date对象,该值永远不能===
为字符串。==
由于类型转换而使用“作品”。但是由于日期字符串的解析在很大程度上仍依赖于实现,因此依靠它来解析随机格式存在严重缺陷。
isDate('Mac OS X 10.14.2')
在这里返回true。
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 */
}
isNan
不是功能。一审案件不正确。
date
为Foostreet 1
,则您的条件为真。
这样的事情怎么样?它将测试它是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);
}
我应该提到,这不能测试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];
}
通过参考以上所有评论,我找到了解决方案。
如果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");
}
你可以玩在这里上的jsfiddle。
YYYY-MM-DD
,因此附加T00:00:00.000Z
并使用此解决方案来检查有效字符串很简单。
这是仅使用的改进功能Date.parse()
:
function isDate(s) {
if(isNaN(s) && !isNaN(Date.parse(s)))
return true;
else return false;
}
注意: Date.parse()将解析数字:例如Date.parse(1)
将返回一个日期。因此,在这里我们检查是否s
不是数字,如果是日期。
这是一个简约的版本。
var isDate = function (date) {
return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date));
}
isDate(" 1")
此可调用函数可以完美运行,为有效日期返回true。请务必使用ISO格式的日期(yyyy-mm-dd或yyyy / mm / dd)进行呼叫:
function validateDate(isoDate) {
if (isNaN(Date.parse(isoDate))) {
return false;
} else {
if (isoDate != (new Date(isoDate)).toISOString().substr(0,10)) {
return false;
}
}
return true;
}
return !isNaN(Date.parse(isoDate)) || isoDate == new Date(isoDate).toISOString().substr(0,10);
我知道这是一个古老的问题,但是我遇到了同样的问题,并且发现没有一个答案能正常工作-特别是从日期中删除数字(1,200,345等),这是原始问题。这是我可以想到的一种非常不合常规的方法,并且似乎可行。请指出是否有失败的情况。
if(sDate.toString() == parseInt(sDate).toString()) return false;
这是清除数字的行。因此,整个功能可能类似于:
function isDate(sDate) {
if(sDate.toString() == parseInt(sDate).toString()) return false;
var tryDate = new Date(sDate);
return (tryDate && tryDate.toString() != "NaN" && tryDate != "Invalid Date");
}
console.log("100", isDate(100));
console.log("234", isDate("234"));
console.log("hello", isDate("hello"));
console.log("25 Feb 2018", isDate("25 Feb 2018"));
console.log("2009-11-10T07:00:00+0000", isDate("2009-11-10T07:00:00+0000"));
console.log("hello 1 ", isDate("hello 1 "));
返回true
检查与日期相关的函数是否可用于该对象以找到它是否为Date对象,是否可以?
喜欢
var l = new Date();
var isDate = (l.getDate !== undefined) ? true; false;
这就是我最终要这样做的方式。这不会涵盖所有格式。您必须进行相应的调整。我可以控制格式,所以对我有用
function isValidDate(s) {
var dt = "";
var bits = [];
if (s && s.length >= 6) {
if (s.indexOf("/") > -1) {
bits = s.split("/");
}
else if (s.indexOf("-") > -1) {
bits = s.split("-");
}
else if (s.indexOf(".") > -1) {
bits = s.split(".");
}
try {
dt = new Date(bits[2], bits[0] - 1, bits[1]);
} catch (e) {
return false;
}
return (dt.getMonth() + 1) === parseInt(bits[0]);
} else {
return false;
}
}
document.getElementById('r1').innerHTML = dayjs('sdsdsd').isValid()
document.getElementById('r2').innerHTML = dayjs('2/6/20').isValid()
<script src="https://unpkg.com/dayjs@1.8.21/dayjs.min.js"></script>
<p>'sdsdsd' is a date: <span id="r1"></span></p>
<p>'2/6/20' is a date: <span id="r2"></span></p>
一个轻量级的库已经为您准备好:Day.js
SimpleDateFormat sdf = new SimpleDateFormat(dateFromat);
sdf.setLenient(false);
默认情况下,它设置为TRUE。因此,即使格式错误的字符串也会返回良好的值。
我用过这样的东西:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
formatter.setLenient(false);
String value = "1990/13/23";
try {
Date date = formatter.parse(value);
System.out.println(date);
}catch (ParseException e)
{
System.out.println("its bad");
}
试试这个:
if (var date = new Date(yourDateString)) {
// if you get here then you have a valid date
}