检查一个string是否是一个date值

什么是一个简单的方法来检查一个值是否是一个有效的date,允许任何已知的date格式。

例如,我的值为10-11-2009 / 10/11/2009 / 2009-11-10T07:00:00+0000 ,应该全部被识别为date值,值10-11-2009 ,被确认为date值。 什么是最简单的方法来检查,如果这是可能的? 因为时间戳也被允许。

Date.parse()足够?

请参阅相关的MDN文档页面 。

2015更新

这是一个古老的问题,但其他新问题如:

  • 如何validationstring是否是js中的有效date

closures这个复制品,所以我认为在这里添加一些新的信息是很重要的。 我在写它,因为我害怕人们实际上复制并粘贴这里发布的一些代码,并在生产中使用它。

这里的大部分答案要么使用一些复杂的正则expression式,只匹配一些非常特定的格式,而是实际做不正确的事情(比如匹配1月32日,而不符合实际ISOdate广告 – 见示例 ), 或者他们尝试传递任何东西到Date构造函数并希望最好的。

使用矩

正如我在这个答案中解释的,目前有一个可用的库: Moment.js

它是一个parsing,validation,操作和显示JavaScriptdate的库,它比标准的JavaScriptdate处理函数具有更丰富的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 

使用瞬间,您可以非常详细地检查有效date。 有时添加一些关于您期望的格式的线索是非常重要的。 例如,如06/22/2015这样的date看起来像一个有效的date,除非您使用格式DD / MM / YYYY,在这种情况下这个date应被拒绝为无效。 有几种方式可以告诉Moment您期望的格式,例如:

 moment("06/22/2015", "MM/DD/YYYY", true).isValid(); // true moment("06/22/2015", "DD/MM/YYYY", true).isValid(); // false 

true论据是在那里,所以Moment不会试图parsinginput,如果它不符合提供的格式之一(这应该是我认为的默认行为)。

您可以使用内部提供的格式:

 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,还有其他库:

  • XDate
  • DateJS

更多信息

也可以看看:

  • 使用 Jay Raj的Moment.jspipe理date和时间
  • 使用JavaScriptdate使用 Bradley Holbrook的Moment.js

Rob Gravelle在JavaScriptdateparsing库中的一系列文章:

  • stream行的JavaScriptdateparsing库综述:Moment.js
  • stream行的JavaScriptdateparsing库的综述:Datejs
  • stream行的JavaScriptdate分析库综述:XDate

底线

当然,任何人都可以尝试重新发明轮子,编写一个正则expression式(但实际上事先阅读ISO 8601和RFC 3339),或者使用随机数据调用buit-in构造函数来parsing错误消息,如'Invalid Date'确保这个消息在所有平台上完全一样吗?在所有的地区?将来?), 或者你可以使用经过testing的解决scheme,并利用你的时间来改进它,而不是重新发明它。 这里列出的所有库都是开源的免费软件。

这就是我现在正在处理的应用程序中解决这个问题的方法:

根据krillgar的反馈进行更新:

 var isDate = function(date) { return (new Date(date) !== "Invalid Date") && !isNaN(new Date(date)); } 

要么…

 var isDate = function(date) { return (new Date(date) !== "Invalid Date" && !isNaN(new Date(date)) ) ) ? true : false; } 

….

new Date(date) === 'Invalid Date'仅适用于Firefox和Chrome。 IE8(我在我的机器上进行testing的那个)给了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 */ } 

这样的事情呢? 它会testing它是一个Date对象还是一个datestring:

 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); } 

我应该提到,这不是testingISO格式化的string,但与RegExp更多的工作,你应该是好的。

这是一个极简主义的版本。

 var isDate = function (date) { return!!(function(d){return(d!=='Invalid Date'&&!isNaN(d))})(new Date(date)); } 

这里没有答案检查date是否是无效的,例如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]; } 

我会这样做

 var myDateStr= new Date("2015/5/2"); if( ! isNaN ( myDateStr.getMonth() )) { console.log("Valid date"); } else { console.log("Invalid date"); } 

在这里玩

这工作:

 var isDate = function(date) { return ((new Date(date)).toString() !== "Invalid Date") ? true : false; } 

检查date相关函数是否可用于查找对象是否是Date对象是否正确?

喜欢

 var l = new Date(); var isDate = (l.getDate !== undefined) ? true; false; 

在尝试了上面列出的所有答案后,我结束了以下几点:

 var checkDateValue = function(date) { return date && (!(new Date(date) == "Invalid Date") && !isNaN(new Date(date))); }; 

请注意, new Date(date) !== "Invalid Date" 始终为真。 希望这可以帮助。

这是我最终做到的。 这不会涵盖所有格式。 你必须做相应的调整。 我有格式的控制,所以它适用于我

 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; } } 

这个可调用函数完美工作,对于有效date返回true。 请务必使用ISO格式的date(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; } 
 SimpleDateFormat sdf = new SimpleDateFormat(dateFromat); sdf.setLenient(false); 

默认情况下,它被设置为TRUE。 所以即使是格式错误的string也会返回好值。

我用过这样的东西:

 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 }