【问题标题】:JavaScript Detecting Valid DatesJavaScript 检测有效日期
【发布时间】:2011-11-11 18:16:09
【问题描述】:

可能重复:
Detecting an “invalid date” Date instance in JavaScript

我使用以下方法检测有效日期:

var text = $('#Date').val();
var date = Date.parse(text);

if (isNaN(date)) {
      // Invalid date
}

但发现 Date.parse 认为以下是有效日期(mm/dd/yyyy)

  • 2/30/2011
  • 2011 年 11 月 31 日

当天数超过总天数时检测无效日期的任何其他方式 一个月有几天?

更新:一个更大的问题是 jQuery 验证插件也没有将其检测为无效日期!

解决方案:

基于@Guffa 的 cmets,我创建了以下函数来验证日期:

function validDate(text) {

    var date = Date.parse(text);

    if (isNaN(date)) {
        return false;
    }

    var comp = text.split('/');

    if (comp.length !== 3) {
        return false;
    }

    var m = parseInt(comp[0], 10);
    var d = parseInt(comp[1], 10);
    var y = parseInt(comp[2], 10);
    var date = new Date(y, m - 1, d);
    return (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d);
}

【问题讨论】:

  • Date.parse 不认为它们是正确的,但它会为您将它们转换为正确的日期。例如。 2/30/2011 将以 03/02/2011 结尾
  • 在投票结束后,我意识到提供的问题相同,尽管它是相关的。
  • 因为我需要支持多种语言环境的输入,所以我们实现了自己的日期解析器。我们发现检测此错误的唯一方法是将我们解析的月份字符串与生成的日期中的月份进行比较
  • momentjs.com/docs/#/parsing/is-valid那样简单地使用moment.js

标签: javascript jquery date jquery-validate


【解决方案1】:

要检查日期是否有效,您可以解析日期的组成部分,从中创建一个Date 对象,并检查数据中的组成部分是否与解析的组成部分相同。如果您从超出范围的组件创建Date 对象,则这些值将流向下一个/上一个时期以创建有效日期。

例如,new Date(2011,0,42) 将创建一个包含日期 2/11/2011 而不是 1/42/2011 的对象。

通过解析组件而不是完整日期,您还可以解决不同日期格式的问题。例如,我的浏览器会期待像 y-m-d 这样的日期格式,而不是 d/m/y

例子:

var text = '2/30/2011';
var comp = text.split('/');
var m = parseInt(comp[0], 10);
var d = parseInt(comp[1], 10);
var y = parseInt(comp[2], 10);
var date = new Date(y,m-1,d);
if (date.getFullYear() == y && date.getMonth() + 1 == m && date.getDate() == d) {
  alert('Valid date');
} else {
  alert('Invalid date');
}

演示:http://jsfiddle.net/Guffa/UeQAK/

【讨论】:

  • 这很好用!除非您需要将 date.getDay() 更改为 date.getDate()。
  • 我找到的最佳答案之一!谢谢古法
  • 为什么投反对票?如果你不解释你认为错的地方是什么,它就无法改进答案。
  • 也许我是偏执狂,但我想知道使用new Date(Date.UTC())Date.prototype.getUTC*() 会不会更安全。
  • 正是我所需要的...这是否考虑闰年?
【解决方案2】:

如果您的日期格式固定为M/D/YYYY,您可以重新格式化解析的日期并查看它是否与输入匹配:

var d = new Date(Date.parse(str))
return str === (d.getMonth()+1)+'/'+d.getDate()+'/'+d.getYear();

但是,这不会容忍空格或零填充数字。

如果您不需要准确地保留用户的输入,您可以重新格式化日期并假装这是他们输入的内容。

但如果你也不能这样做,我会自己使用 RegExp 解析出组件,然后将它们与来自 Date 方法的值进行比较。

【讨论】:

    【解决方案3】:

    您可以编写一个脚本来手动执行此操作:

    function checkDate(day, month) {
       if ((month == 4 || month == 6 || month == 9 || month == 11) && day < 30) {
           alert("Date is valid")
       }
       else if (month == 2 && day <= 28) {
           alert("Date is valid")
       }
       else if ((month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) && day <= 31) {
           alert("Date is valid")
       }
       else {
           alert("Date is in-valid")
       }
    }
    

    当然,您还需要注意闰年,但请记住,任何能被 4 而不能被 100 整除的年份都是闰年,除非年份的前两位数能被 4 整除。那应该很容易包含在这个函数中。

    【讨论】:

    • 声明 == 不是 = ?
    【解决方案4】:

    例子错了

    正确的是

    if ((month == 4 || month == 6 || month == 9 || month == 11) && day <= 30)
    

    &lt;= 而不是=

    但是这个例子很棒!

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 1970-01-01
      • 2022-01-23
      • 2015-10-21
      • 1970-01-01
      相关资源
      最近更新 更多