在JavaScript中检测“无效日期”日期实例


1492

我想说出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函数的想法吗?

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

18
您可以通过将函数的主体更改为以下内容来删除if语句:return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) );
styfle 2011年

3
@styfle-猜想这是一种样式首选项:我发现将类型检查与相等逻辑分开更清楚。
orip 2011年

26
@orip话语恰恰是在问题中极力劝阻的内容。请参考相关的元主题以了解其背后的原理。在问题本身中回答自己的问题是违反站点策略的。OTOH,感谢您的答复,并在回答中加上“编辑”是典型的绒毛。如果您想通过最热门的问题将您识别为一个不知道SO是什么以及如何使用SO,并且不希望学习它的人,请成为我的客人。

14
@orip:它不是“丢失”的;如果您想再次查看它,它仍然使问题的修订历史更加混乱。但这不属于问题。在37k代表时,您应该知道这一点。
Lightness Races in Orbit

6
请停止编辑战争。关于这个问题的编辑在meta上讨论。请不要进一步编辑/回滚此帖子。如果您不同意先前的编辑/回滚或对它们有任何评论,请在该元主题上发布而不是在此处。
伦丁

Answers:


1301

这是我的处理方式:

if (Object.prototype.toString.call(d) === "[object Date]") {
  // it is a date
  if (isNaN(d.getTime())) {  // d.valueOf() could also work
    // date is not valid
  } else {
    // date is valid
  }
} else {
  // not a date
}

更新[2018-05-31]:如果您不关心其他JS上下文(外部窗口,框架或iframe)中的Date对象,则首选以下更简单的形式:

function isValidDate(d) {
  return d instanceof Date && !isNaN(d);
}

21
instanceof跨帧中断。鸭式输入也可以正常工作:validDate == d && d.getTime &&!isNaN(d.getTime()); -由于问题是针对通用效用函数,因此我希望更为严格。
Borgar

11
@Borgar,刚刚找到了我的答案:“在多框架DOM环境中编写脚本时会出现问题。简而言之,在一个iframe中创建的Array对象不会与在另一个iframe中创建的数组共享[[Prototype]]它们的构造函数是不同的对象,因此instanceof和构造函数检查都将失败。”
灰烬

64
你甚至不需要d.getTime只是isNan(d)
TecHunter

8
可以这样简化:d instanceof Date && !isNaN(d.getTime())
Zorgatone

5
感谢您的回答,但我想强调@Borgar和@blueprintChris的注释:1例如,如果我解析数字,我仍然会有一个有效日期,结果Mon Jan 01 2001 00:00:00确实是一个日期,但是对于我的应用程序来说,它是完全没有用的。因此,至少在我的情况下,需要更多的输入验证。这个答案证实dateObject不是Date
dnhyde

264

除了使用之外,new Date()您应该使用:

var timestamp = Date.parse('foo');

if (isNaN(timestamp) == false) {
  var d = new Date(timestamp);
}

Date.parse()返回时间戳,该整数表示自1970年1月1日以来的毫秒数。NaN如果无法解析提供的日期字符串,它将返回。


119
-1 Dunno为什么具有如此高的票数,Date.parse取决于实现,并且绝对不值得解析常规日期字符串。在流行的浏览器中,没有一种可以正确解析的格式,更不用说所有正在使用的格式了(尽管最终在ES5中指定的ISO8601格式应该可以)。
RobG

1
如果使用new Date('foo'),则基本上与该Date.parse('foo')方法等效。参见:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…因此@RobG所说的也适用于它。
golddragon007

2
此测试将在Chrome中失败。例如,Chrome中的Date.parse('AAA-0001')给了我一个数字。
尼克

失败...检测所有数值
Hos Mercury

109

您可以检查的有效性Date对象d通过

d instanceof Date && isFinite(d)

为避免跨框架问题,可以将instanceof支票替换为

Object.prototype.toString.call(d) === '[object Date]'

要在通话getTime()Borgar的回答是不必要的,因为isNaN()isFinite()两个隐式转换为数字。


在Chrome浏览器中尝试此操作-Object.prototype.toString.call(new Date(“ 2013-07-09T19:07:9Z”))。它将返回“ [对象日期]”。因此,根据您的说法,“ 2013-07-09T19:07:9Z”应为有效日期。但事实并非如此。您可以通过var dateStr = new Date(“ 2013-07-09T19:07:9Z”)再次在Chrome中对其进行验证。dateStr将返回无效的日期。
Tintin

2
@Tintin:这就是isFinite()是- toString.call()只为一个更换instanceof支票的一部分
克里斯托夫

与“ [对象日期]”进行比较是否可以在非英语浏览器中使用?我对此表示怀疑。
kristianp

2
@kristianp实际上它可能并且甚至可能是ECMAScript规范的一部分。但是,是的,这看起来很丑。
2015年

对我来说,第一种方法是最好的选择,尽管我不确定使用isFiniteover 是否有任何现实优势isNaN(两者都可以使用Date(Infinity))。此外,如果您想要相反的条件,它将变得更简单:if (!(date instanceof Date) || isNaN(date))
安德鲁

86

我的解决方案是仅检查您是否获得了有效的日期对象:

实作

Date.prototype.isValid = function () {
    // An invalid date object returns NaN for getTime() and NaN is the only
    // object not strictly equal to itself.
    return this.getTime() === this.getTime();
};  

用法

var d = new Date("lol");

console.log(d.isValid()); // false

d = new Date("2012/09/11");

console.log(d.isValid()); // true

28
isNaN是测试NaN的更明确方法
orip 2012年

1
然而,你总能找到人写他们自己的版本:) documentcloud.github.com/underscore/docs/...
灰克拉克

4
由于我尊重underscore.js,因此引发了一些研究。isNaN("a") === true一会儿("a" !== "a") === false。值得思考。+1
orip 2012年

8
我测试了这里找到的3个主要解决方案的性能。恭喜,您是赢家!jsperf.com/detecting-an-invalid-date
zVictor 2014年

2
@Ali这是有效的日期对象。 new Date("02-31-2000") // Thu Mar 02 2000 00:00:00 GMT+0000 (GMT Standard Time)。如果要将字符串传递给日期构造函数,则必须传递标准化字符串才能获得可靠的结果。具体来说,“字符串应采用Date.parse()方法可识别的格式”。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
灰克拉克

71

检查有效日期的最短答案

if(!isNaN(date.getTime()))

2
唯一的问题是日期是否不是日期类型。您会收到一个JS错误。
安德鲁(Andrew)

@Andrew,您需要创建日期对象,如果您已经有一个对象,则使用date && !isNaN(date.getTime())
abhirathore2006 '18

如果date不是Date类型,那仍然会给您JS错误。例如:var date = 4; date && !isNaN(date.getTime());
安德鲁

@Andrew使用 date instanceof Date && !isNaN(date.getTime())
abhirathore2006 '18

3
是的,就像8年前的其他答案一样。:P stackoverflow.com/a/1353945/2321042
安德鲁(Andrew)

45

您可以简单地使用 moment.js

这是一个例子:

var m = moment('2015-11-32', 'YYYY-MM-DD');
m.isValid(); // false

验证部分文档中非常清楚。

而且,以下分析标志会导致无效的日期:

  • overflow:日期字段的溢出,例如第13个月,该月的第32天(或非years年的2月29日),一年的第367天等。溢出包含无效单位的索引匹配#invalidAt(见下文);-1表示没有溢出。
  • invalidMonth:月份名称无效,例如moment('Marbruary','MMMM');。包含无效的月份字符串本身,否则为null。
  • empty:不包含任何可解析内容的输入字符串,例如moment('this is nosense');。布尔值。
  • 等等。

资料来源:http//momentjs.com/docs/


6
最佳解决方案,非常易于实现,可以使用任何格式(我的情况是dd / MM / yyyy),还知道the年,并且不会将无效日期(即2015年2月29日)本身转换为有效日期(即30/03/2015)。要查看格式为dd / MM / yyyy的日期,我只需要使用moment("11/06/1986", "DD/MM/YYYY").isValid();
Rafael Merlin

3
不赞成使用Moment :(
James Sumners 2015年

2
此使用尚未折旧。折旧不带格式字符串的矩(输入)(除非输入为ISO格式)。
2013年

2
处理许多日期时,此方法可能会非常慢。在这些情况下,最好使用正则表达式。
Grid Trekkor

2
moment.js的使用可能很简单,但是却是巨大的开销。这个图书馆很大。我拒绝了你的回答。
米克,

38

要提及的是,jQuery UI DatePicker小部件具有非常好的日期验证器实用程序方法,该方法可检查格式和有效性(例如,不允许使用01/33/2013日期)。

即使您不想将页面上的datepicker小部件用作UI元素,也可以始终将其.js库添加到页面中,然后调用Validator方法,将要验证的值传递到其中。为了使生活更加轻松,它使用字符串作为输入,而不是JavaScript Date对象。

看到: http //api.jqueryui.com/datepicker/

它没有作为方法列出,但作为实用程序函数存在。在页面上搜索“ parsedate”,您将找到:

$ .datepicker.parseDate(format,value,settings)-从具有指定格式的字符串值中提取日期。

用法示例:

var stringval = '01/03/2012';
var testdate;

try {
  testdate = $.datepicker.parseDate('mm/dd/yy', stringval);
             // Notice 'yy' indicates a 4-digit year value
} catch (e)
{
 alert(stringval + ' is not valid.  Format must be MM/DD/YYYY ' +
       'and the date value must be valid for the calendar.';
}

(有关重新指定日期格式的更多信息,请参见http://api.jqueryui.com/datepicker/#utility-parseDate

在上面的示例中,您不会看到警报消息,因为“ 01/03/2012”是指定格式的日历有效日期。但是,例如,如果使“ stringval”等于“ 13/04/2013”​​,则会收到警报消息,因为值“ 13/04/2013”​​不是日历有效的。

如果成功解析了传入的字符串值,则“ testdate”的值将是一个Javascript Date对象,表示传入的字符串值。如果没有,它将是不确定的。


3
感谢使用非英语/区域设置日期格式的第一个答案。
斧头。

26

我真的很喜欢Christoph的方法(但没有足够的声誉来表扬它)。对于我的使用,我知道我将始终有一个Date对象,因此我只是使用有效的()方法扩展了日期。

Date.prototype.valid = function() {
  return isFinite(this);
}

现在我可以编写它了,它比仅在代码中检查isFinite更具描述性...

d = new Date(userDate);
if (d.valid()) { /* do stuff */ }

10
扩展原型?那是一个很大的JavaScript,不,不!
Jasdeep Khalsa 2015年

由于isFinite完美地为我工作,因此颇具争议。但是,是的,扩展原型毫无意义。!isFiniteDate将捕获的事实DateInvalid Date。另外值得注意的是我的上下文在Node内部。
Staghouse,

23
// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());

5
@Borgar 2年前的一样...有什么新消息?
蓝蓝的

11
它是两行,而不是丑陋的嵌套if语句。
Cypher

17

您可以通过此脚本检查txDate.value的有效格式。如果格式不正确,则不会引用Date对象,并向dt返回null。

 var dt = new Date(txtDate.value)
 if (isNaN(dt))

正如@MiF的简短建议

 if(isNaN(new Date(...)))

isNaN(new Date(...))-简单和简短的方法
MiF

1
@MiF是的,我用您的建议更新了我的回答;)谢谢
Yuseferi

16

我使用以下代码验证年份,月份和日期的值。

function createDate(year, month, _date) {
  var d = new Date(year, month, _date);
  if (d.getFullYear() != year 
    || d.getMonth() != month
    || d.getDate() != _date) {
    throw "invalid date";
  }
  return d;
}

有关详细信息,请参阅javascript中的检查日期。


str没有被使用。
samis

12

这里已经有太多复杂的答案,但是简单的一行就足够了(ES5):

Date.prototype.isValid = function (d) { return !isNaN(Date.parse(d)) } ;

甚至在ES6中:

Date.prototype.isValid = d => !isNaN(Date.parse(d));

1
从MDN:“ Date.parse()方法解析日期的字符串表示形式,并返回自1970年1月1日UTC或NaN以来的毫秒数...”因此,在此期间运行潜在的日期函数返回整数或NaN。然后,isNaN()函数将提供一个干净的布尔值,告诉您原始值是否为有效的日期对象。这足以进行抽查,但是上面的示例随后将此方法附加到Date对象,以使该功能易于使用并在整个程序中易于读取。
Max Wilder '18

如果d是布尔值,您将收到0或1而不是Nan!
davcup

@davcup刚刚使用进行了测试Date.parse(true),我正确地获得了一个NaN。
Sebastien H.

12

我看到了一些非常接近这个小片段的答案。

JavaScript方式:

function isValidDate(dateObject){ return new Date(dateObject).toString() !== 'Invalid Date'; }
isValidDate(new Date('WTH'));

TypeScript方式:

const isValidDate = dateObject => new Date(dateObject ).toString() !== 'Invalid Date';
isValidDate(new Date('WTH'));

1
不知道我是否缺少某些东西,但是两次做新的Date()毫无意义吗?
乔恩·卡特穆尔

2
后者与TypeScript 无关。这是完全有效的JS。
hackel

9

不错的解决方案!包含在我的辅助功能库中,现在看起来像这样:

Object.isDate = function(obj) {
/// <summary>
/// Determines if the passed object is an instance of Date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.prototype.toString.call(obj) === '[object Date]';
}

Object.isValidDate = function(obj) {
/// <summary>
/// Determines if the passed object is a Date object, containing an actual date.
/// </summary>
/// <param name="obj">The object to test.</param>

    return Object.isDate(obj) && !isNaN(obj.getTime());
}

9

这对我有用

new Date('foo') == 'Invalid Date'; //is true

但是这没有用

new Date('foo') === 'Invalid Date'; //is false

5
我相信这取决于浏览器。
barrypicker

@barrypicker这是什么意思,这取决于浏览器?
Ajil O.

您可以执行以下操作: `${new Date('foo')}` === 'Invalid Date'
Daniele Vrut


6

在尝试验证日期(例如2012年2月31日)时,这些答案都没有对我有用(在Safari 6.0中进行了测试),但是,在尝试大于31的任何日期时,它们都可以正常工作。

所以我不得不蛮力一点。假设日期格式为mm/dd/yyyy。我正在使用@broox答案:

Date.prototype.valid = function() {
    return isFinite(this);
}    

function validStringDate(value){
    var d = new Date(value);
    return d.valid() && value.split('/')[0] == (d.getMonth()+1);
}

validStringDate("2/29/2012"); // true (leap year)
validStringDate("2/29/2013"); // false
validStringDate("2/30/2012"); // false

(new Date('2/30/2014'))。valid()返回true
Andre Figueiredo

1
自从我回答了这个问题已经有一段时间了,但是您可能需要两个返回条件,包括&& value.split('/')[0] == (d.getMonth()+1);
Dex 2014年

使用new Date('string date')与等效Date.parse('string date'),请参阅:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,因此您可能会得到错误的true或false值。
golddragon007

5

上面的解决方案都没有对我起作用,但是起作用的是

function validDate (d) {
        var date = new Date(d);
        var day = ""+date.getDate();
        if( day.length == 1)day = "0"+day;
        var month = "" +( date.getMonth() + 1);
        if( month.length == 1)month = "0"+month;
        var year = "" + date.getFullYear();

        return ((month + "/" + day + "/" + year) == d);
    }

上面的代码将在JS将02/31/2012转换为03/02/2012时显示其无效


3
好的,但这将测试字符串是否为M / D / Y格式的日期,而不是“有效和无效日期对象之间的差异”。这不是真正的问题。
Borgar 2012年

之所以要对照格式进行检查,是为了检查日期是否在解析后发生了变化
John

OP是否要求一种返回布尔值而不是格式化字符串的方法?
barrypicker 2014年

1
示例代码确实返回一个布尔值,格式化在测试某些无效情况中起着重要作用。
约翰

5
IsValidDate: function(date) {
        var regex = /\d{1,2}\/\d{1,2}\/\d{4}/;
        if (!regex.test(date)) return false;
        var day = Number(date.split("/")[1]);
        date = new Date(date);
        if (date && date.getDate() != day) return false;
        return true;
}

4

我已经写了这个功能。向其传递一个字符串参数,它将基于此格式“ dd / MM / yyyy”确定是否为有效日期。

这是一个测试

输入:“ haha​​ha”,输出:false。

输入:“ 29/2/2000”,输出:true。

输入:“ 29/2/2001”,输出:false。

function isValidDate(str) {
    var parts = str.split('/');
    if (parts.length < 3)
        return false;
    else {
        var day = parseInt(parts[0]);
        var month = parseInt(parts[1]);
        var year = parseInt(parts[2]);
        if (isNaN(day) || isNaN(month) || isNaN(year)) {
            return false;
        }
        if (day < 1 || year < 1)
            return false;
        if(month>12||month<1)
            return false;
        if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day > 31)
            return false;
        if ((month == 4 || month == 6 || month == 9 || month == 11 ) && day > 30)
            return false;
        if (month == 2) {
            if (((year % 4) == 0 && (year % 100) != 0) || ((year % 400) == 0 && (year % 100) == 0)) {
                if (day > 29)
                    return false;
            } else {
                if (day > 28)
                    return false;
            }      
        }
        return true;
    }
}

4

Date.prototype.toISOStringRangeError在无效日期抛出(至少在Chromium和Firefox中)。您可以将其用作验证的方法,并且可能不需isValidDate要这样做(EAFP)。否则为:

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

1
看来这是唯一一个通过ECMA-262定义引发错误的函数。15.9.5.43 Date.prototype.toISOString()此函数返回一个String值,该值表示此Date对象所表示的时间实例。字符串的格式是15.9.1.15中定义的日期时间字符串格式。所有字段都存在于字符串中。时区始终为UTC,后缀Z表示。如果此对象的时间值不是有限数字,则会引发RangeError异常。
亨利·刘

3

受Borgar方法的启发,我确保代码不仅验证日期,而且实际上确保该日期是真实日期,这意味着不允许使用31/09/2011和29/02/2011之类的日期。

function(dateStr) {
    s = dateStr.split('/');
    d = new Date(+s[2], s[1]-1, +s[0]);
    if (Object.prototype.toString.call(d) === "[object Date]") {
        if (!isNaN(d.getTime()) && d.getDate() == s[0] && 
            d.getMonth() == (s[1] - 1)) {
            return true;
        }
    }
    return "Invalid date!";
}

但是...上面的方法(@Borgar和其他方法)已经在检查这种类型的有效性...我无法解决问题。
蓝蓝的

博尔加(Borgar)没有-看到他自己对他的回答的评论。
EML 2013年

1
此解决方案仅在您所在的国家/地区使用该dd/MM/yyyy符号时才有效。另外,它true在有效时返回;'Invalid date!'如果无效,则最好仅返回1种类型。
A1rPun 2015年

3

我结合了在检查给定对象时发现的最佳性能结果:

结果如下:

function isValidDate(input) {
  if(!(input && input.getTimezoneOffset && input.setUTCFullYear))
    return false;

  var time = input.getTime();
  return time === time;
};

2

将日期对象转换为字符串是检测两个字段是否均为有效日期的更简单可靠的方法。例如,如果您在日期输入字段中输入“ -------”。上述某些答案将不起作用。

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

2

所选答案非常好,我也正在使用它。但是,如果您正在寻找一种验证用户日期输入的方法,则应注意,Date对象非常持久,可以将看起来无效的构造参数转换为有效的构造参数。以下单元测试代码说明了这一点:

QUnit.test( "valid date test", function( assert ) {
  //The following are counter-examples showing how the Date object will 
  //wrangle several 'bad' dates into a valid date anyway
  assert.equal(isValidDate(new Date(1980, 12, 15)), true);
  d = new Date();
  d.setFullYear(1980);
  d.setMonth(1);
  d.setDate(33);
  assert.equal(isValidDate(d), true);
  assert.equal(isValidDate(new Date(1980, 100, 150)), true);
  //If you go to this exterme, then the checker will fail
  assert.equal(isValidDate(new Date("This is junk")), false);
  //This is a valid date string
  assert.equal(isValidDate(new Date("November 17, 1989")), true);
  //but is this?
  assert.equal(isValidDate(new Date("November 35, 1989")), false);  
  //Ha!  It's not.  So, the secret to working with this version of 
  //isValidDate is to pass in dates as text strings... Hooboy
  //alert(d.toString());
});

2
function isValidDate(strDate) {
    var myDateStr= new Date(strDate);
    if( ! isNaN ( myDateStr.getMonth() ) ) {
       return true;
    }
    return false;
}

这样称呼它

isValidDate(""2015/5/2""); // => true
isValidDate(""2015/5/2a""); // => false

2

根据最高评分的答案准备的功能:

  /**
   * Check if date exists and is valid.
   *
   * @param {String} dateString Date in YYYY-mm-dd format.
   */
  function isValidDate(dateString) {
  var isValid = false;
  var date;

  date =
    new Date(
      dateString);

  if (
    Object.prototype.toString.call(
      date) === "[object Date]") {

    if (isNaN(date.getTime())) {

      // Date is unreal.

    } else {
      // Date is real if month and day match each other in date and string (otherwise may be shifted):
      isValid =
        date.getUTCMonth() + 1 === dateString.split("-")[1] * 1 &&
        date.getUTCDate() === dateString.split("-")[2] * 1;
    }
  } else {
    // It's not a date.
  }

  return isValid;
}

2

简单优雅的解决方案:

const date = new Date(`${year}-${month}-${day} 00:00`)
const isValidDate = (Boolean(+date) && date.getDate() == day)

资料来源:

[1] https://medium.com/@esganzerla/simple-date-validation-with-javascript-caea0f71883c

[2] JavaScript中new Date()中显示的日期不正确


1
date.getDate() == day不足以确定日期是否有效。在某些实现中,原始日期格式将返回无效日期,无论该日期是否有效。如果正确解析,“ 1970-01-01 00:00”也将返回false(即Boolean(+new Date("1970-01-01"))返回false)。
RobG

警告:这不会在Safari工作
Vigrant

如果使用以下格式,它将在Safari中工作:const date = new Date(year, month, day); 请注意,以这种方式将月份索引为0,因此您可能必须减去1才能将其正确排列。
凌晨

1

我认为这是一个漫长的过程。我们可以缩短它,如下所示:

 function isValidDate(dateString) {
        debugger;
        var dateStringSplit;
        var formatDate;

        if (dateString.length >= 8 && dateString.length<=10) {
            try {
                dateStringSplit = dateString.split('/');
                var date = new Date();
                date.setYear(parseInt(dateStringSplit[2]), 10);
                date.setMonth(parseInt(dateStringSplit[0], 10) - 1);
                date.setDate(parseInt(dateStringSplit[1], 10));

                if (date.getYear() == parseInt(dateStringSplit[2],10) && date.getMonth()+1 == parseInt(dateStringSplit[0],10) && date.getDate() == parseInt(dateStringSplit[1],10)) {
                    return true;
                }
                else {
                    return false;
                }

            } catch (e) {
                return false;
            }
        }
        return false;
    }

3
该问题询问如何找到无效的Date实例,而不是字符串,以及:谁说日期不能用除正斜杠之外的其他符号分隔?
Jon z

1

对于日期中基于int 1的成分:

var is_valid_date = function(year, month, day) {
    var d = new Date(year, month - 1, day);
    return d.getFullYear() === year && (d.getMonth() + 1) === month && d.getDate() === day
};

测试:

    is_valid_date(2013, 02, 28)
&&  is_valid_date(2016, 02, 29)
&& !is_valid_date(2013, 02, 29)
&& !is_valid_date(0000, 00, 00)
&& !is_valid_date(2013, 14, 01)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.