我有一个文本字段,用户以格式dd/mm/YYYY hh:ii
输入日期时间。我想使用javascript检查这是否是一个有效的日期时间。这应该包括2月29日和一切。我怎样才能做到这一点?由于特殊的月份,正则表达式不会成功。
答案 0 :(得分:3)
请参阅http://internotredici.com/article/checkdateinjavascript/,查看有关检查时间的有用文章 - 正是您想要的内容!
下面是文章全文
在javascript中查看日期 文章于2006年1月31日发布在Scripting下 程序员经常需要验证插入到表单中的信息,并检查它们的正确性是否有用,从javascript中获益。本教程将解释如何使用javascript来验证日期是否有效。 表单中的日期以两种不同的方式插入,第一种使用文本字段,其中用户类型数据遵循不同的模式(在本教程中,我们假设日期是dd-mm-yyyy格式);第二个使用下拉菜单。第一种解决方案更容易实现,但用户会遇到更多错误(例如,插入无效字符或更频繁的输入日期,格式与已计划的格式不同)。 假设我们现在有以下文本字段,我们要在其中插入dd-mm-yyyy格式的日期:
<form id="test_form" action="get" method="/checkdatejavascript"
onsubmit="return(check_form(this)); return false;">
<input type="text" name="datefield" id="datefield" />
</form>
要检查插入数据的正确性,我们将使用check_form函数:
function check_form()
{
// Regular expression used to check if date is in correct format
var pattern = new RegExp([0-3][0-9]-(0|1)[0-9]-(19|20)[0-9]{2});
if(document.getElementById('datefield').value.match(pattern))
{
var date_array = document.getElementById('datefield')
.value.split('-');
var day = date_array[0];
// Attention! Javascript consider months in the range 0 - 11
var month = date_array[1] - 1;
var year = date_array[2];
// This instruction will create a date object
source_date = new Date(year,month,day);
if(year != source_date.getFullYear())
{
alert('Year is not valid!');
return false;
}
if(month != source_date.getMonth())
{
alert('Month is not valid!');
return false;
}
if(day != source_date.getDate())
{
alert('Day is not valid!');
return false;
}
}
else
{
alert('Date format is not valid!');
return false;
}
return true;
} 正如我们所看到的,用蓝色表示的正则表达式用于控制插入的日期是否遵循默认的指定格式。如果模式有效,则函数继续执行下一步,否则将发出错误消息,不发送abd表单(正则表达式保证日期不能为空)。 要验证日期,我们将使用javascript提供的Date对象。 (检查以红色表示的代码)。算法非常简单。使用用户插入的信息,我们将创建一个Date对象,并使用方法getFullYear,getMonth和getDate,我们将生成三个值,分别代表与之关联的年份,月份和日期。如果这些值等于用户插入的值,则日期是正确的。现在考虑以下示例:
用户在文本字段中插入字符串09-01-1976 从字符串创建的日期对象是09-01-1976 日期有效
用户在文本字段中插入字符串31-02-2006 从字符串创建的日期对象是03-03-2006 日期无效
程序员必须以javascript处理日期的方式特别注意(检查以绿色表示的代码),因为假设o是1月,11是12月,则认为月份在0到11的范围内。 如果下拉菜单用于插入日期,则控件更简单,因为正则表达式不需要验证日期格式:
<form id="test_form" action="get" method="/checkdatejavascript"
onsubmit="return(check_form(this)); return false;">
<select name="dateday" id="dateday">
<option value="1">1</option>
[…]
</select>
<select name="datemonth" id="datemonth">
<option value="0">January</option>
[…]
</select>
<select name="dateyear" id="dateyear">
<option value="2006">2006</option>
[…]
</select>
</form>
将控制日期正确性的javascript函数是
function check_form()
{
var day = document.getElementById('dateday').value;
var month = document.getElementById('datemonth').value;
var year = document.getElementById('dateyear').value;
// This instruction will create a date object
source_date = new Date(year,month,day);
if(year != source_date.getFullYear())
{
alert('Year is not valid!');
return false;
}
if(month != source_date.getMonth())
{
alert('Month is not valid!');
return false;
}
if(day != source_date.getDate())
{
alert('Day is not valid!');
return false;
}
return true;
}
更新:我已更新代码,因为正则表达式存在问题。感谢Alex的建议
答案 1 :(得分:2)
如果使用moment.js没问题,可以查看http://momentjs.com/docs/#/parsing/string-format/日期时间解析实用程序。例如:
moment("29/02/2014 11:45", "DD/MM/YYYY hh:mm", true).isValid()
答案 2 :(得分:1)
如果您不想使用其他外部库,可以使用以下功能:
var validateDate = function(dateTime){
var f_date = dateTime.split(" ")[0].split("/").reverse().join("/");
var time = dateTime.split(" ")[1];
var date = dateTime.split(" ")[0].split("/").map(function(c, i, a){
return parseInt(c);
});
var daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31];
if ( (!(date[2] % 4) && date[2] % 100) || !(date[2] % 400)) {
console.log("inside");
daysInMonth[1] = 29;
}
if(date[0] > 0 && (date[0] <= daysInMonth[(date[1]-1)]) && date[1] > 0 && date[1] <= 12){
return new Date(f_date + " " + time) != "Invalid Date";
}
return false;
}
这也将照顾闰年变化。仅当输入采用dd/mm/YYYY hh:ii
格式时,此功能才有效。
您可以尝试这样的一些示例输入:
validateDate("29/2/2000 12:30"); // Should return true
validateDate("29/2/2001 12:30"); // Should return false
validateDate("32/8/2000 12:30"); // Should return false
validateDate("30/11/2000 12:30"); // Should return true
validateDate("31/4/2000 12:30"); // Should return false
validateDate("15/7/2000 12:77"); // Should return false