我正在尝试测试以确保日期有效,因为如果有人进入,2/30/2011
那么它应该是错误的。
我怎么能用任何日期做到这一点?
我正在尝试测试以确保日期有效,因为如果有人进入,2/30/2011
那么它应该是错误的。
我怎么能用任何日期做到这一点?
验证日期字符串的一种简单方法是转换为日期对象并进行测试,例如
// 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))
})
以这种方式测试日期时,只需要测试月份,因为如果日期超出范围,月份就会改变。如果月份超出范围,则相同。任何年份都有效。
您还可以测试日期字符串的位:
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(s) 是否适用于输入字符串“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]);
}
我推荐使用moment.js。只提供日期到时刻会验证它,不需要传递日期格式。
var date = moment("2016-10-19");
然后date.isValid()
给出想要的结果。
在这里发帖
此解决方案不解决明显的日期验证问题,例如确保日期部分是整数或日期部分符合明显的验证检查,例如日期大于 0 且小于 32。此解决方案假定您已经拥有所有三个日期部分(年、月、日)并且每个都已经通过了明显的验证。鉴于这些假设,此方法应该可以用于简单地检查日期是否存在。
例如,2009 年 2 月 29 日不是实际日期,但 2008 年 2 月 29 日是。当你创建一个新的 Date 对象时,比如 2009 年 2 月 29 日,看看会发生什么(记住在 JavaScript 中月份是从零开始的):
console.log(new Date(2009, 1, 29));
以上行输出:Sun Mar 01 2009 00:00:00 GMT-0800 (PST)
请注意日期如何简单地滚动到下个月的第一天。假设您有其他明显的验证,此信息可用于通过以下函数确定日期是否真实(此函数允许基于非零的月份以便更方便地输入):
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;
}
此函数返回给定的输入是否为有效日期的布尔值。前任:
if(isDate_(var_date)) {
// statements if the date is valid
} else {
// statements if not valid
}