我想知道JS中有效日期对象和无效日期对象之间的区别,但无法弄清楚:

var d = new Date("foo");
console.log(d.toString()); // shows 'Invalid Date'
console.log(typeof d); // shows 'object'
console.log(d instanceof Date); // shows 'true'

编写isValidDate函数有什么想法吗?

Ash建议使用Date.parse来解析日期字符串,这提供了一种权威的方法来检查日期字符串是否有效。如果可能的话,我更希望我的API接受Date实例,并能够检查/断言它是否有效。Borgar的解决方案做到了这一点,但我需要在浏览器上进行测试。我还想知道是否有更优雅的方式。Ash让我考虑不让我的API接受Date实例,这是最容易验证的。Borgar建议测试Date实例,然后测试Date的时间值。如果日期无效,则时间值为NaN。我用ECMA-262检查了一下,这种行为符合标准,这正是我所要的。


当前回答

日期对象到字符串是检测两个字段是否为有效日期的更简单可靠的方法。例如,如果在日期输入字段中输入此“-------”。上面的一些答案行不通。

jQuery.validator.addMethod("greaterThan", 

    function(value, element, params) {
        var startDate = new Date($(params).val());
        var endDate = new Date(value);

        if(startDate.toString() === 'Invalid Date' || endDate.toString() === 'Invalid Date') {
            return false;
        } else {
            return endDate > startDate;
        }
    },'Must be greater than {0}.');

其他回答

这里只有少数人(@Zen、@Dex、@wanglab……)对javascript容忍在2月、4月、6月等月份溢出日数。。。

如果指定要处理的格式(即yyyy-MM-dd),则在解决方案中根本不必使用javascript对象Date。

函数leapYear(年){return((年%4==0)&&(年%100!=0))||(年%400==0);}函数validateStr(dateStr){if(/^[0-9][0-9][0-9][0-9][0-9]-[0-9][9-9]-[0-9][0-9][0-9]$/.test(dateStr)==false){return false;}var m=parseInt(dateStr.substr(5,2));var d=parseInt(dateStr.substr(8,2));var y=parseInt(dateStr.substr(0,4));//您可以为大于5000:-D的值添加年度检查如果(m>12||d>31){return false;}否则,如果(m==2&&d>28){如果(d==29){if(!leapYear(y)){return false;}}其他{return false;}}否则如果(d>30&&(m==4||m==6||m==9||m===11)){return false;}返回true;}console.log(“2020-02-29:”+validateDateStr(“2020:02-29”));//真的console.log(“2020-02-30:”+validateDateStr(“2020:02-30”));//假的console.log(“2022-02-29:”+validateDateStr(“20202-02-29”));//假的console.log(“2021-02-28:”+validateDateStr(“2011-02-28”));//真的console.log(“2020-03-31:”+validateDateStr(“2020:03-31”));//真的console.log(“2020-04-30:”+validateDateStr(“2020:04-30”));//真的console.log(“2020-04-31:”+validateDateStr(“2020:04-31”));//假的console.log(“2020-07-31:”+validateDateStr(“2020:07-31”));//真的console.log(“2020-07-32:”+validateDateStr(“2020:07-32”));//假的控制台日志(“2020-08-31:”+validateDateStr(“2020:08-31”));//真的console.log(“2020-12-03:”+validateDateStr(“2020-102-03”));//真的console.log(“2020-13-03:”+validateDateStr(“2020-103-03”));//假的console.log(“0020-12-03:”+validateDateStr(“0020-102-03”));//真的//无效正则表达式console.log(“20-12-03:”+validateDateStr(“20-12-103”));//假的console.log(“2020-012-03:”+validateDateStr(“2020:012-03”));//假的console.log(“2020-12-003:”+validateDateStr(“2020-102-003”));//假的

检查日期是否为有效日期对象的另一种方法:

const isValidDate = (date) => 
  typeof date === 'object' && 
  typeof date.getTime === 'function' && 
  !isNaN(date.getTime())

Date.prototype.toISOString在无效日期引发RangeError(至少在Chromium和Firefox中)。您可以使用它作为一种验证方法,并且可能不需要isValidDate(EAFP)。否则:

function isValidDate(d)
{
  try
  {
    d.toISOString();
    return true;
  }
  catch(ex)
  {
    return false;    
  }    
}

为什么我建议moment.js

这是非常受欢迎的图书馆

简单地解决所有日期和时间、格式和时区问题

易于检查字符串日期是否有效

var date = moment("2016-10-19");
date.isValid()

我们无法解决验证所有案例的简单方法

分歧

如果我插入有效数字,如89,90,95英寸new Date()在几个应答器上,我得到了坏结果,但它返回真

常量isValidDate=date=>{console.log('input'+date)var date=新日期(日期);console.log(日期)回来(Object.product.toString.call(date)==“[Object date]”&&+date)//返回!isNaN(date.getTime())}var test=“2012年4月5日”console.log(isValidDate(测试))var测试=“95”console.log(isValidDate(测试))var测试=“89”console.log(isValidDate(测试))var测试=“80”console.log(isValidDate(测试))var test=“badstring”console.log(isValidDate(测试))

如果使用iots,则可以直接使用解码器DateFromISOString。

import { DateFromISOString } from 'io-ts-types/lib/DateFromISOString'

const decoded = DateFromISOString.decode('2020-05-13T09:10:50.957Z')