jQuery中是否有isDate
函数?
如果输入是日期,则应返回true
,否则返回false
。
答案 0 :(得分:35)
如果您不想处理外部库,那么一个简单的仅限JavaScript的解决方案是:
function isDate(val) {
var d = new Date(val);
return !isNaN(d.valueOf());
}
更新:!!主要警告!!
@BarryPicker在评论中提出了一个很好的观点。所有非闰年,JavaScript默默地将2月29日转换为3月1日。此行为似乎严格限制在31天(例如,3月32日未转换为4月1日,但6月31日转换为7月1日)。根据您的情况,这可能是您可以接受的限制,但您应该了解它:
>>> new Date('2/29/2014')
Sat Mar 01 2014 00:00:00 GMT-0500 (Eastern Standard Time)
>>> new Date('3/32/2014')
Invalid Date
>>> new Date('2/29/2015')
Sun Mar 01 2015 00:00:00 GMT-0500 (Eastern Standard Time)
>>> isDate('2/29/2014')
true // <-- no it's not true! 2/29/2014 is not a valid date!
>>> isDate('6/31/2015')
true // <-- not true again! Apparently, the crux of the problem is that it
// allows the day count to reach "31" regardless of the month..
答案 1 :(得分:5)
根据您尝试实施此操作的方式,您可以在设置the "validate" jQuery plugin的情况下使用the date
option。
答案 2 :(得分:4)
jQuery核心中没有内置的日期功能......它并没有直接帮助日期做任何事情,因此它上面没有很多库(除非它们是日期选择器等等) )。 There are several JavaScript date libraries available though,让他们更轻松地与他们合作。
我无法肯定地回答什么是最好的......这取决于他们是如何进入的以及你正在处理的文化,请记住,不同的文化被用来以不同的格式看待他们的日期,作为快速示例,MM/DD/YYYY
vs YYYY/MM/DD
(或其他几十个)。
答案 3 :(得分:4)
javascript中最简单的方法是:
function isDate(dateVal) {
var d = new Date(dateVal);
return d.toString() === 'Invalid Date'? false: true;
}
答案 4 :(得分:2)
获取用户日期输入的最佳方式是仅提供有效日期的日期选择器。 它可以用字符串完成,但是你可能会要求用户使用你选择的格式来惹恼用户。
您需要在验证器中指定日期是否在几个月之前。
这使用第二个参数来强制执行订单。 没有第二个参数,它使用计算机的默认顺序。
// computer default date format order:
Date.ddmm= (function(){
return Date.parse('2/6/2009')> Date.parse('6/2/2009');
})()
允许月份名称和数字:'2000年1月21日'或'1975年10月21日'
function validay(str, order){
if(order== undefined) order= Date.ddmm? 0: 1;
var day, month, D= Date.parse(str);
if(D){
str= str.split(/\W+/);
// check for a month name first:
if(/\D/.test(str[0])) day= str[1];
else if (/\D/.test(str[1])) day= str[0];
else{
day= str[order];
month= order? 0: 1;
month= parseInt(str[month], 10) || 13;
}
try{
D= new Date(D);
if(D.getDate()== parseInt(day, 10)){
if(!month || D.getMonth()== month-1) return D;
}
}
catch(er){}
}
return false;
}
答案 5 :(得分:1)
问题是2月31日进入将返回JavaScript中的有效日期。输入年,月和日,将其变为日期,并查看该日期是否与您输入的日期相匹配,而不是3月的某一天。
function isDate(y, m, d) {
var a = new Date(y, m-1, d);
// subtract 1 from the month since .getMonth() is zero-indexed.
if (a.getFullYear() == y && a.getMonth() == m-1 && a.getDate() == d) {
return true;
} else {
return false;
}
}
从技术上讲,这是vanilla JavaScript,因为jQuery并没有真正扩展到本机Date对象。
答案 6 :(得分:0)
Date.parse将prb排除你,而不需要jquery:
<击> http://www.w3schools.com/jsref/jsref_parse.asp 击>
以上删除后,某种灵魂指出了基本的parseDate究竟是什么。
JQuery UI Datepicker插件中还有一个“parseDate”方法:
答案 7 :(得分:0)
如果您不想使用jquery插件,我在以下位置找到了该函数:
http://www.codetoad.com/forum/17_10053.asp
适合我。我找到的其他人工作得不好。
更新:
来自页面的缓存版本:http://web.archive.org/web/20120228171226/http://www.codetoad.com/forum/17_10053.asp
// ******************************************************************
// This function accepts a string variable and verifies if it is a
// proper date or not. It validates format matching either
// mm-dd-yyyy or mm/dd/yyyy. Then it checks to make sure the month
// has the proper number of days, based on which month it is.
// The function returns true if a valid date, false if not.
// ******************************************************************
function isDate(dateStr) {
var datePat = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/;
var matchArray = dateStr.match(datePat); // is the format ok?
if (matchArray == null) {
alert("Please enter date as either mm/dd/yyyy or mm-dd-yyyy.");
return false;
}
month = matchArray[1]; // p@rse date into variables
day = matchArray[3];
year = matchArray[5];
if (month < 1 || month > 12) { // check month range
alert("Month must be between 1 and 12.");
return false;
}
if (day < 1 || day > 31) {
alert("Day must be between 1 and 31.");
return false;
}
if ((month == 4 || month == 6 || month == 9 || month == 11) && day == 31) {
alert("Month " + month + " doesn`t have 31 days!")
return false;
}
if (month == 2) { // check for february 29th
var isleap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
if (day > 29 || (day == 29 && !isleap)) {
alert("February " + year + " doesn`t have " + day + " days!");
return false;
}
}
return true; // date is valid
}
答案 8 :(得分:0)
我到达了这个解决方案,因为我使用的是欧洲格式,而且javascript显然是美国人,因此变得更加复杂!
function CheckDate()
{
var D = document.getElementById('FlightDate').value;
var values = D.split("-")
var newD = values [1] + "/" + values [0] + "/" + values[2]
var d = new Date(newD);
if(d == 'Invalid Date')document.getElementById('FlightDate').value = "";
}
凌乱,但是做到了。 如果你的用户是美国人并把这一天放在中间,(我永远不会理解!),那么你可以省去拆分和创建新的。
我很可能通过设置文化或其他方式来覆盖JS中的默认美国主义,但我的目标受众只是欧洲人,因此以这种方式进行操作更容易。 (哦,这在Chrome中有效,没有在其他任何方面进行过测试。)
答案 9 :(得分:0)
我想你想要这样的东西。如果适合您,则+1。
HTML
Date : <input type="text" id="txtDate" /> (mm/dd/yyyy)
<br/><br/><br/>
<input type="button" value="ValidateDate" id="btnSubmit"/>
jQuery
$(function() {
$('#btnSubmit').bind('click', function(){
var txtVal = $('#txtDate').val();
if(isDate(txtVal))
alert('Valid Date');
else
alert('Invalid Date');
});
function isDate(txtDate)
{
var currVal = txtDate;
if(currVal == '')
return false;
var rxDatePattern = /^(\d{1,2})(\/|-)(\d{1,2})(\/|-)(\d{4})$/; //Declare Regex
var dtArray = currVal.match(rxDatePattern); // is format OK?
if (dtArray == null)
return false;
//Checks for mm/dd/yyyy format.
dtMonth = dtArray[1];
dtDay= dtArray[3];
dtYear = dtArray[5];
if (dtMonth < 1 || dtMonth > 12)
return false;
else if (dtDay < 1 || dtDay> 31)
return false;
else if ((dtMonth==4 || dtMonth==6 || dtMonth==9 || dtMonth==11) && dtDay ==31)
return false;
else if (dtMonth == 2)
{
var isleap = (dtYear % 4 == 0 && (dtYear % 100 != 0 || dtYear % 400 == 0));
if (dtDay> 29 || (dtDay ==29 && !isleap))
return false;
}
return true;
}
});
CSS
body{
font-family:Tahoma;
font-size : 8pt;
padding-left:10px;
}
input[type="text"]
{
font-family:Tahoma;
font-size : 8pt;
width:150px;
}
答案 10 :(得分:0)
您应该使用moment.js,它是处理各种日期的最佳库。 解决问题的方法:
var inputVal = '2012-05-25';
moment(inputVal , 'YYYY-MM-DD', true).isValid();