如何确定给定字符串是否代表日期?

时间:2010-10-07 10:10:44

标签: javascript jquery

jQuery中是否有isDate函数?

如果输入是日期,则应返回true,否则返回false

11 个答案:

答案 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”方法:

http://docs.jquery.com/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;
}

DEMO

答案 10 :(得分:0)

您应该使用moment.js,它是处理各种日期的最佳库。 解决问题的方法:

var inputVal = '2012-05-25';
moment(inputVal , 'YYYY-MM-DD', true).isValid();