如何确认日期?

我试图测试,以确保一个日期是有效的意义上,如果有人进入 2/30/2011然后它应该是错误的。

我怎么能和任何一个约会对象这样做呢?

149550 次浏览

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

// 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))
})

以这种方式测试 Date 时,只需要测试月份,因为如果日期超出范围,月份将发生变化。如果月份超出范围也一样。任何年份都有效。

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

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

RobG 提出的第一个函数 isValidDate 是否适用于输入字符串“1/2/”? 我认为没有,因为年份没有被确认;

我的建议是使用这个函数的改进版本:

//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]);
}

此解决方案不处理明显的日期验证,例如确保日期部分为整数,或者日期部分符合明显的验证检查,例如日期大于0小于32。这个解决方案假设您已经拥有了所有三个日期部分(年、月、日) ,并且每个日期部分都已经通过了明显的验证。考虑到这些假设,这种方法只需检查日期是否存在即可。

例如,2009年2月29日不是一个真正的日期,但2008年2月29日是。当您创建一个新的 Date 对象(比如2009年2月29日)时,看看会发生什么(请记住,在 JavaScript 中,月份从零开始) :

console.log(new Date(2009, 1, 29));

以上行输出: 2009年3月1日星期日00:00:00 GMT-0800(太平洋标准时间)

注意日期是如何简单地滚动到下个月的第一天的。假设你已经有了其他明显的验证,这些信息可以用以下函数来判断一个日期是否真实(这个函数允许以非零为基础的月份作为更方便的输入) :

var isActualDate = function (month, day, year) {
var tempDate = new Date(year, --month, day);
return month === tempDate.getMonth();
};

这不是一个完整的解决方案,也没有考虑 i18n,但是它可以更加健壮。

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

该函数返回输入是否为有效日期的 bool 值:

if(isDate_(var_date)) {
// statements if the date is valid
} else {
// statements if not valid
}
function isValidDate(year, month, day) {
var d = new Date(year, month - 1, day, 0, 0, 0, 0);
return (!isNaN(d) && (d.getDate() == day && d.getMonth() + 1 == month && d.getYear() == year));
}

我只是重拍 RobG 解决方案

var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
var isLeap = new Date(theYear,1,29).getDate() == 29;


if (isLeap) {
daysInMonth[1] = 29;
}
return theDay <= daysInMonth[--theMonth]

这是 ES6(带 let 声明)。

function checkExistingDate(year, month, day){ // year, month and day should be numbers
// months are intended from 1 to 12
let months31 = [1,3,5,7,8,10,12]; // months with 31 days
let months30 = [4,6,9,11]; // months with 30 days
let months28 = [2]; // the only month with 28 days (29 if year isLeap)


let isLeap = ((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0);


let valid = (months31.indexOf(month)!==-1 && day <= 31) || (months30.indexOf(month)!==-1 && day <= 30) || (months28.indexOf(month)!==-1 && day <= 28) || (months28.indexOf(month)!==-1 && day <= 29 && isLeap);


return valid; // it returns true or false
}

在这种情况下,我打算从1到12个月。如果你喜欢或者使用0-11模型,你可以改变数组:

let months31 = [0,2,4,6,7,9,11];
let months30 = [3,5,8,10];
let months28 = [1];

如果你的日期是 dd/mm/yyyy 格式的,那么你可以去掉日期、月份和年份的函数参数,然后检索它们:

let arrayWithDayMonthYear = myDateInString.split('/');
let year = parseInt(arrayWithDayMonthYear[2]);
let month  = parseInt(arrayWithDayMonthYear[1]);
let day = parseInt(arrayWithDayMonthYear[0]);

如果函数是有效日期,则返回 true,否则返回 false: D

function isDate  (day, month, year){
if(day == 0 ){
return false;
}
switch(month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(day > 31)
return false;
return true;
case 2:
if (year % 4 == 0)
if(day > 29){
return false;
}
else{
return true;
}
if(day > 28){
return false;
}
return true;
case 4: case 6: case 9: case 11:
if(day > 30){
return false;
}
return true;
default:
return false;
}
}


console.log(isDate(30, 5, 2017));
console.log(isDate(29, 2, 2016));
console.log(isDate(29, 2, 2015));

我建议使用 Moment.js,只需提供 date to moment 即可验证,不需要传递 dateFormat。

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

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

发布 给你

不幸的是,目前 JavaScript 似乎没有简单的方法来验证日期字符串。这是我能想到的在现代浏览器中以“ m/d/yyyy”格式解析日期的最简单方法(这就是为什么它没有指定 parseInt 的基数,因为从 ES5开始它应该是10) :

const dateValidationRegex = /^\d{1,2}\/\d{1,2}\/\d{4}$/;
function isValidDate(strDate) {
if (!dateValidationRegex.test(strDate)) return false;
const [m, d, y] = strDate.split('/').map(n => parseInt(n));
return m === new Date(y, m - 1, d).getMonth() + 1;
}


['10/30/2000abc', '10/30/2000', '1/1/1900', '02/30/2000', '1/1/1/4'].forEach(d => {
console.log(d, isValidDate(d));
});

嗨,请在下面找到答案。这是通过验证新创建的日期来完成的

var year=2019;
var month=2;
var date=31;
var d = new Date(year, month - 1, date);
if (d.getFullYear() != year
|| d.getMonth() != (month - 1)
|| d.getDate() != date) {
alert("invalid date");
return false;
}