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

Posted

技术标签:

【中文标题】在 JavaScript 中检测“无效日期”日期实例【英文标题】:Detecting an "invalid date" Date instance in JavaScript 【发布时间】:2010-11-24 03:09:56 【问题描述】:

我想告诉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,这种行为符合标准,这正是我想要的。

【问题讨论】:

我删除了我的原始答案,因为检查 NaN 是否比与字符串“无效日期”进行比较更好的解决方案。我必须自己使用 isNaN 解决方案。 @orip,“让我的 API 接受一个 Date 实例并能够检查/断言它是否有效”你试过:isNan(d.getTime())==true日期实例? 您可以通过将函数主体更改为:return ( Object.prototype.toString.call(d) === "[object Date]" && !isNaN(d.getTime()) ); 来删除 if 语句 @styfle - 当然,但为什么呢? @styfle - 猜这是一种风格偏好:我发现将类型检查与相等逻辑分开更清楚。 【参考方案1】:

你应该使用 new Date() 而不是:

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

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

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

【讨论】:

-1 不知道为什么会有这么多赞成票,Date.parse 是依赖于实现的,并且绝对不能被信任来解析一般的日期字符串。在流行的浏览器中,没有一种格式可以正确解析,更不用说所有正在使用的格式了(尽管最终 ISO8601 格式 specified in ES5 应该没问题)。 如果您使用new Date('foo'),则基本上等同于Date.parse('foo') 方法。见:developer.mozilla.org/en-US/docs/Web/javascript/Reference/…@RobG 所说的,也适用于它。 此测试在 Chrome 中会失败。例如,Chrome 中的 Date.parse('AAA-0001') 给了我一个数字。 失败...检测所有数值 需要美国 MM/DD/YYYY 格式才能工作。 Date.parse('24/12/2021') 返回NaN【参考方案2】:

我会这样做:

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

【讨论】:

instanceof 跨帧中断。鸭子打字也可以正常工作:validDate == d && d.getTime && !isNaN(d.getTime()); -- 因为问题是针对一般效用函数,所以我更喜欢更严格。 @Borgar,刚刚找到我的答案:“在多帧 DOM 环境中编写脚本时会出现问题。简而言之,在一个 iframe 中创建的 Array 对象不共享 [[Prototype]]是在另一个 iframe 中创建的数组。它们的构造函数是不同的对象,因此 instanceof 和构造函数检查都失败了。" 你甚至不需要d.getTime 只需isNan(d) 可以这样简化:d instanceof Date && !isNaN(d.getTime()) 感谢您的回答,但我想强调@Borgar 和@blueprintChris cmets:例如,如果我解析数字1,我仍然会有一个有效日期导致Mon Jan 01 2001 00:00:00 这确实是一个日期,但就我的申请而言,它完全没用。因此,至少在我的情况下还需要一些输入验证。这个答案验证了 dateObject 而不是 Date!【参考方案3】:

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

d instanceof Date && isFinite(d)

为避免跨框架问题,可以将instanceof 检查替换为

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

在Borgar's answer 中调用getTime() 是不必要的,因为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:这就是isFinite() 的用途——toString.call() 只是支票中instanceof 部分的替代品 与 '[object Date]' 比较是否适用于非英语浏览器?我对此表示怀疑。 @kristianp 实际上它可能会,甚至可能是 ECMAScript 规范的一部分。但是,是的,它看起来很丑。 对我来说,这里的第一种方法是最好的选择,尽管我不确定使用isFinite 是否比isNaN 有任何实际优势(两者都适用于@987654335 @)。此外,如果您想要相反的条件,它会变得更简单:if (!(date instanceof Date) || isNaN(date))【参考方案4】:

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

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

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

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

【讨论】:

扩展原型?这是一个很大的 JavaScript 不不! 由于isFinite 的支持非常适合我。但是,是的,扩展原型毫无意义。在Date 上的!isFinite 会发现DateInvalid Date。另外值得注意的是,我的上下文在 Node 内部。 我不知道为什么有些人建议使用 isFinite 而不是 isNaN,因为 isFinite 对于更大范围的数字返回 true (-∞ !isNaN(date) 更语义化、更准确且更少输入。【参考方案5】:

我基于Borgar's solution编写了以下解决方案。包含在我的辅助函数库中,现在看起来像这样:

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

【讨论】:

【参考方案6】:
// check whether date is valid
var t = new Date('2011-07-07T11:20:00.000+00:00x');
valid = !isNaN(t.valueOf());

【讨论】:

2年前@Borgar wrote还是一样的...有什么新变化?? 这是两行而不是丑陋的嵌套 if 语句。 警告:空值作为有效值传递 这不会检查日期是否有效,它只是测试内置解析器是否能够使用它喜欢的任何特定于实现的启发式方法将其解析为有效的日期。有很多例子,Date.parse(string) 在一个实现中返回一个有效的 Date 对象,而在另一个实现中返回一个无效的 Date 或不同的有效 Date。【参考方案7】:

我认为其中一些是一个漫长的过程。我们可以把它剪短,如下所示:

 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;
    

【讨论】:

问题询问如何找到无效的 Date 实例,而不是字符串,此外:谁说日期不能用正斜杠以外的东西分隔?【参考方案8】:

受Borgar's approach 的启发,我确保代码不仅验证日期,而且实际上确保日期是真实日期,这意味着不允许 2011 年 9 月 31 日和 2011 年 2 月 29 日这样的日期。

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's 和其他人)已经检查了这种类型的有效性...我无法解决这个问题。 Borgar 没有 - 请参阅他自己对他的回答的评论。 此解决方案仅在您的国家/地区使用dd/MM/yyyy 表示法时有效。此外,它在有效时返回true,如果无效则返回'Invalid date!',最好只返回一种类型。【参考方案9】:

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

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;

详情请参考Check date in javascript

【讨论】:

str 未被使用。 好的,现在这是天才,据我所知,这是验证像“1970 年 2 月 31 日”这样糟糕的日期的最佳且唯一的方法。希望我能投 10 票。 链接已损坏 这个答案实际上验证了日期,而不仅仅是日期格式。我唯一要添加的是检查您在月份中传递的值,因为在 Javascript 中,月份是从 0 开始的。必须从传入的值中减去 1 才能得到正确的 JS 月份值。 (month = month - 1; before var d = new Date(...) 例如,如果你在 Date() 中将“2”传递给月份参数,它将创建 March。【参考方案10】:

您可以使用此脚本检查 txDate.value 的有效格式。如果格式不正确,则 Date 对象未实例化并将 null 返回给 dt。

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

正如@MiF 建议的那样

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

【讨论】:

有一个问题 - !isNan(new Date(123)) 这也是 return true @AbhishekTomar 使用第一个。它返回 true 吗? 两者都是一样的,只是写法不同。【参考方案11】:

以上解决方案都没有对我有用,但是有效的是

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 时它是无效的

【讨论】:

好的,但这会测试字符串是否是 M/D/Y 格式的日期,而不是“有效和无效日期对象之间的差异”。这不是这个问题的真正意义。 之所以检查格式是为了检查日期在解析后是否发生了变化 OP 不是要求返回布尔值而不是格式化字符串的方法吗? 示例代码确实返回了一个布尔值,格式在测试一些无效情况时发挥了作用。【参考方案12】:

在尝试验证诸如 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 我已经有一段时间没有回答这个问题了,但您可能需要两个返回条件,包括&amp;&amp; value.split('/')[0] == (d.getMonth()+1); 使用 new Date('string date') 等同于 Date.parse('string date'),请参阅:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…,因此您可能会得到 false true 或 false 值。【参考方案13】:

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

实施

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

【讨论】:

isNaN 是一种更明确的测试 NaN 的方法 然而,你总能发现人们编写自己的版本 :) documentcloud.github.com/underscore/docs/… 因为我尊重 underscore.js 这促使一些研究。 isNaN("a") === true,而("a" !== "a") === false。值得思考。 +1 我测试了我在这里找到的 3 个主要解决方案的性能。恭喜你,你是赢家! jsperf.com/detecting-an-invalid-date @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/…【参考方案14】:
IsValidDate: function(date) 
        var regex = /\d1,2\/\d1,2\/\d4/;
        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;

【讨论】:

【参考方案15】:

想提一下,jQuery UI DatePicker 小部件有一个非常好的日期验证实用程序方法,可以检查格式和有效性(例如,不允许 01/33/2013 日期)。

即使您不想将页面上的 datepicker 小部件用作 UI 元素,您也可以随时将其 .js 库添加到您的页面,然后调用验证器方法,将您想要验证的值传递给它.为了让生活更轻松,它接受一个字符串作为输入,而不是 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 日期对象。如果不是,它将是未定义的。

【讨论】:

赞成成为第一个使用非英语/区域设置日期格式的答案。 之前的评论不正确且具有误导性。 javascript 中的Date 对象处理任何语言环境中的日期和许多 ISO 格式(甚至一些非 ISO,具体取决于实现)【参考方案16】:

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

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

【讨论】:

【参考方案17】:

您可以简单地使用 moment.js

这是一个例子:

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

文档中的validation section很清楚。

此外,以下解析标志会导致日期无效:

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

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

【讨论】:

最佳解决方案,非常容易实现,适用于任何格式(我的情况是 dd/MM/yyyy),也知道闰年并且不会转换无效日期(即 29/02/2015 ) 变成有效的(即 2015 年 3 月 30 日)。要检查格式为 dd/MM/yyyy 的日期,我只需要使用 moment("11/06/1986", "DD/MM/YYYY").isValid(); 不推荐使用 Moment :( 此用途尚未折旧。不带格式字符串的调用 moment(input) 会被贬低(除非输入是 ISO 格式的)。 这个方法在处理很多日期时会非常慢。在这些情况下最好使用正则表达式。 moment.js 的使用可能很简单,但开销巨大。这个图书馆很大。我对你的回答投了反对票。【参考方案18】:

对于日期的基于 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)

【讨论】:

【参考方案19】:

您可以将日期和时间转换为毫秒getTime()

this getTime() 方法返回 Not a Number NaN 无效时

if(!isNaN(new Date("2012/25/255").getTime()))
  return 'valid date time';
  return 'Not a valid date time';

【讨论】:

这不起作用!isNaN(new Date("2/30/2012").getTime())返回true【参考方案20】:

这对我有用

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

但是这没有用

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

【讨论】:

我相信这取决于浏览器。 @barrypicker 你是什么意思这取决于浏览器? 你可以这样做:`$new Date('foo')` === 'Invalid Date' 如果要进行类型比较,请使用.toString() 方法。 new Date('foo').toString() === 'Invalid Date' 将返回 true @AjilO.——这意味着不同的实现可能会以不同的方式解析输入字符串(在本例中为“foo”),因此一个浏览器所说的有效,另一个可能会说是不同的日期或无效。跨度> 【参考方案21】:
var isDate_ = function(input) 
        var status = false;
        if (!input || input.length <= 0) 
          status = false;
         else 
          var result = new Date(input);
          if (result == 'Invalid Date') 
            status = false;
           else 
            status = true;
          
        
        return status;
      

【讨论】:

【参考方案22】:

我已经编写了这个函数。传递一个字符串参数,它将根据这种格式“dd/MM/yyyy”确定它是否是有效日期。

这是一个测试

输入:“哈哈哈”,输出:假。

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

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

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;
    

【讨论】:

【参考方案23】:

选择的答案非常好,我也在使用它。但是,如果您正在寻找一种验证用户日期输入的方法,您应该知道 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());
);

【讨论】:

【参考方案24】:

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

是一个日期实例 (benchmark here) 有一个有效日期 (benchmark here)

结果如下:

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

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

【讨论】:

【参考方案25】:

此函数验证由字符分隔的数字格式的字符串日期,例如dd/mm/yyyy, mm/dd/yyyy

/*
Param  : 
1)the date in string data type 
2)[optional - string - default is "/"] the date delimiter, most likely "/" or "-"
3)[optional - int - default is 0] the position of the day component when the date string is broken up via the String.split function (into arrays)
4)[optional - int - default is 1] the position of the month component when the date string is broken up via the String.split function (into arrays)
5)[optional - int - default is 2] the position of the year component when the date string is broken up via the String.split function (into arrays)

Return : a javascript date is returned if the params are OK else null
*/
function IsValidDate(strDate, strDelimiter, iDayPosInArray, iMonthPosInArray, iYearPosInArray) 
    var strDateArr; //a string array to hold constituents day, month, and year components
    var dtDate; //our internal converted date
    var iDay, iMonth, iYear;


    //sanity check 
    //no integer checks are performed on day, month, and year tokens as parsing them below will result in NaN if they're invalid
    if (null == strDate || typeof strDate != "string")
        return null;

    //defaults
    strDelimiter = strDelimiter || "/";
    iDayPosInArray = undefined == iDayPosInArray ? 0 : iDayPosInArray;
    iMonthPosInArray = undefined == iMonthPosInArray ? 1 : iMonthPosInArray;
    iYearPosInArray = undefined == iYearPosInArray ? 2 : iYearPosInArray;

    strDateArr = strDate.split(strDelimiter);

    iDay = parseInt(strDateArr[iDayPosInArray],10);
    iMonth = parseInt(strDateArr[iMonthPosInArray],10) - 1; // Note: months are 0-based
    iYear = parseInt(strDateArr[iYearPosInArray],10);

    dtDate = new Date(
        iYear,
        iMonth, // Note: months are 0-based
        iDay);

    return (!isNaN(dtDate) && dtDate.getFullYear() == iYear && dtDate.getMonth() == iMonth && dtDate.getDate() == iDay) ? dtDate : null; // Note: months are 0-based

调用示例:

var strDate="18-01-1971";

if (null == IsValidDate(strDate)) 

  alert("invalid date");

【讨论】:

【参考方案26】:

通常我会坚持使用浏览器堆栈中的任何日期植入。这意味着截至本回复日期,在 Chrome、Firefox 和 Safari 中调用 toDateString() 时,您将始终收到“无效日期”。

if(!Date.prototype.isValidDate)
  Date.prototype.isValidDate = function()
    return this.toDateString().toLowerCase().lastIndexOf('invalid') == -1;
  ;

我没有在 IE 中测试过。

【讨论】:

【参考方案27】:
function isValidDate(date) 
  return !! (Object.prototype.toString.call(date) === "[object Date]" && +date);

【讨论】:

请编辑此内容以提供更多背景/解释您正在执行的各种“魔术”。 将 +date 视为 date.toNumber(实际上没有 .toNumber 方法)和 parseInt(date) !== +date, parseInt(date) === NaN。 "+" 运算符是 js 中的魔法。而不是跨浏览器:试试这个:[new Date(Date.now()) + 1, +new Date(Date.now()) + 1]【参考方案28】:
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

【讨论】:

【参考方案29】:

对于 Angular.js 项目,您可以使用:

angular.isDate(myDate);

【讨论】:

当测试一个使用无效日期初始化的日期对象时返回 true。【参考方案30】:

这种风格的 isValidDate 使用处理闰年的正则表达式:

function isValidDate(value)

    return /((^(10|12|0?[13578])([/])(3[01]|[12][0-9]|0?[1-9])([/])((1[8-9]\d2)|([2-9]\d3))$)|(^(11|0?[469])([/])(30|[12][0-9]|0?[1-9])([/])((1[8-9]\d2)|([2-9]\d3))$)|(^(0?2)([/])(2[0-8]|1[0-9]|0?[1-9])([/])((1[8-9]\d2)|([2-9]\d3))$)|(^(0?2)([/])(29)([/])([2468][048]00)$)|(^(0?2)([/])(29)([/])([3579][26]00)$)|(^(0?2)([/])(29)([/])([1][89][0][48])$)|(^(0?2)([/])(29)([/])([2-9][0-9][0][48])$)|(^(0?2)([/])(29)([/])([1][89][2468][048])$)|(^(0?2)([/])(29)([/])([2-9][0-9][2468][048])$)|(^(0?2)([/])(29)([/])([1][89][13579][26])$)|(^(0?2)([/])(29)([/])([2-9][0-9][13579][26])$))/.test(value)

【讨论】:

以上是关于在 JavaScript 中检测“无效日期”日期实例的主要内容,如果未能解决你的问题,请参考以下文章

在 oracle 中选择无效的日期字符串

无效日期的“无效日期”? [复制]

隐藏luxon中的无效日期

防止无效日期在jdk6中转换为下个月的日期?

BigQuery:无效日期错误

检查 Amazon Redshift 中的无效日期