如何验证日期?

Set*_*can 67 javascript validation

我正在尝试测试,以确保日期是有效的,如果有人进入,2/30/2011那么它应该是错误的.

我怎么能在任何日期这样做?

Rob*_*obG 122

验证日期字符串的一种简单方法是转换为日期对象并测试,例如

// Expect input as d/m/y
function isValidDate(s) {
  var bits = s.split('/');
  var d = new Date(bits[2], bits[1] - 1, bits[0]);
  return d && (d.getMonth() + 1) == bits[1];
}

['0/10/2017','29/2/2016','01/02'].forEach(function(s) {
  console.log(s + ' : ' + isValidDate(s))
})
Run Code Online (Sandbox Code Playgroud)

以这种方式测试日期时,只需要测试月份,因为如果日期超出范围,月份将会改变.如果月份超出范围,则相同.任何一年都有效.

您还可以测试日期字符串的位:

function isValidDate2(s) {
  var bits = s.split('/');
  var y = bits[2],
    m = bits[1],
    d = bits[0];
  // Assume not leap year by default (note zero index for Jan)
  var daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

  // If evenly divisible by 4 and not evenly divisible by 100,
  // or is evenly divisible by 400, then a leap year
  if ((!(y % 4) && y % 100) || !(y % 400)) {
    daysInMonth[1] = 29;
  }
  return !(/\D/.test(String(d))) && d > 0 && d <= daysInMonth[--m]
}

['0/10/2017','29/2/2016','01/02'].forEach(function(s) {
  console.log(s + ' : ' + isValidDate2(s))
})
Run Code Online (Sandbox Code Playgroud)

  • 注意:用于示例2的dateformat是dd/mm/yyyy而不是mm/dd/yyyy (6认同)

Pio*_*tek 10

RobG提出的第一个函数isValidDate是否适用于输入字符串'1/2 /'?我想不是,因为YEAR没有经过验证;(

我的主张是使用此功能的改进版本:

//input in ISO format: yyyy-MM-dd
function DatePicker_IsValidDate(input) {
        var bits = input.split('-');
        var d = new Date(bits[0], bits[1] - 1, bits[2]);
        return d.getFullYear() == bits[0] && (d.getMonth() + 1) == bits[1] && d.getDate() == Number(bits[2]);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我建议使用moment.js.只提供日期到时间将验证它,不需要传递dateFormat.

var date = moment("2016-10-19");
Run Code Online (Sandbox Code Playgroud)

然后date.isValid()给出期望的结果.

Se发布在这里

  • 仅当日期格式为“RFC2822 或 ISO”格式时,此方法才有效。否则它会向下传递到原始的 Date 构造函数。所以它不能解决op的问题:`moment('2/30/2011').isValid()`返回`true`。 (2认同)