我正在尝试检查用户输入字段以查看它是否在将来以及它是否为 dd/mm/yyyy 格式,但我不知道为什么我的代码的格式部分根本没有触发!事实上,Jsfiddle 似乎没有任何工作,但至少我的"将来检查日期"功能在本地工作。
我不知道正确的方法。
为了解释这一点,我创建了这个小提琴
这是我完整的JavaScript代码。顺便说一下,我需要保持纯JavaScript:
function checkdate(){
//var sendDate = document.getElementById('send_year').value + '/' + document.getElementById('send_month').value + '/' + document.getElementById('send_day').value;
var sendDate = document.getElementById('returning_date').value;
sendDate = new Date(Date.parse(sendDate.replace(/-/g,' ')))
today = new Date();
today.setHours(0,0,0,0)
if (sendDate < today) {
//alert('The date can't be in the past. Please pick another date.');
document.getElementById('error8').innerHTML = 'The date can't be in the past. Please pick another date.';
return false;
}
else
{
document.getElementById('error8').innerHTML = '';
}
if(sendDate.match(/^[0-9]{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])/))
{
alert('works out');
}
}
有人可以就此问题提供建议吗?
提前谢谢。
一个问题是你试图运行sendDate.match,但sendDate已经转换为Date对象,所以它没有match方法。
您应该在将正则表达式转换为 Date 之前运行正则表达式,在验证中,您通常会在运行进一步验证(如范围验证)之前检查输入是否符合格式。
日期字符串应始终手动解析,永远不应允许 Date 构造函数或 Date.parse 解析字符串(Date 构造函数以与 Date.parse 完全相同的方式解析字符串)。
要解析和验证日期字符串相当简单,只需解析字符串并查看是否获得有效日期:
/* Parse a string in d/m/y format. Separator can be any non–digit
** Avoid conversion of two digit dates to 20th century
** Returns an invalid Date if string is not a valid date (per ECMA-262)
**
** @param {string} s - Date string to parse
** @returns {Date}
*/
function parseDMY(s) {
var b = s.split(/D/);
var d = new Date();
d.setHours(0,0,0,0);
d.setFullYear(b[2], --b[1], b[0]);
return d && d.getMonth() == b[1]? d : new Date(NaN);
}
// Test valid date
document.write(parseDMY('23/01/2016'));
// Test invalid date
document.write('<br>' + parseDMY('35/12/2016'));
请注意,这将接受类似 1/5/16 的日期,并将日期视为 0016 年 5 月 1 日。如果要保证日和月值具有两位数和年份,请添加:
/^ddDddDd{4}$/.test(s)
到最后的验证测试。但是,我不喜欢强制使用2位数字表示日期和月份,因为人们通常不会将日期写为"01/08/2016",而是使用"1/8/2016"。
首先,函数需要包装在 <head>
中(点击 js 选项卡中的齿轮),否则找不到函数。
但是您的主要问题是您使用的是欧洲风格的日期格式,因此在创建日期时会出现"无效日期"异常。有关如何将其转换为美国样式并使其可用于Date
对象的信息,请参阅此问题(检查所有可能用途的参考)
我的建议是:
Date.prototype.fromString = function(str) {
var m = str.match(/([0-9]{2})(-|/)([0-9]{2})(-|/)([0-9]{4})/);
if (m == null) {
return null;
}
for (var i = 0; i < m.length; i++) {
if (typeof(m[i]) === 'undefined') {
return null;
};
};
var year = parseInt(m[5]);
var month = parseInt(m[1]) - 1;
var day = parseInt(m[3]);
if (month == 0 || day == 0) {
return null;
}
return new Date(year, month, day);
}
function checkdate(e, obj, errMsgSel){
var sendDate =obj.value;
sendDate = (new Date()).fromString(sendDate);
if (sendDate == null) {
if (e.type == 'blur') {
obj.value = '';
}
return;
}
today = new Date();
today.setHours(0,0,0,0)
if (sendDate < today) {
//alert('The date can't be in the past. Please pick another date.');
document.getElementById(errMsgSel).innerHTML = 'The date can't be in the past. Please pick another date.';
return false;
}
else
{
document.getElementById(errMsgSel).innerHTML = '';
}
} $(function () {
});
<input onblur="checkdate(event, this, 'error8');" onKeyUp="checkdate(event, this, 'error8');" type='text' name="text1" placeholder='dd/mm/yyyy' id='returning_date'>
<span id='error8' style='color:red;'>format</span> <br><Br>