验证javascript日期

时间:2011-08-17 19:02:08

标签: javascript date

是否有一种快速方法可以验证此格式的日期/时间是否有效? 我宁愿不用子串将其分解并尽可能重建它

  

“YYYY-MM-DD HH:MM:SS”

5 个答案:

答案 0 :(得分:6)

您可以将日期字符串解析为ISO字符串(通过将空格转换为“T”并附加Zulu时区,例如“2011-08-16T12:34:56Z”),然后将生成日期的ISO字符串与原始ISO字符串进行比较

function isValidDateString(s) {
  try {
    var isoStr = (""+s).replace(/ /,'T') + "Z"
      , newStr = new Date(isoStr).toISOString();
    return isoStr.slice(0,19) == newStr.slice(0,19);
  } catch (e) {
    return false;
  }
}

这样,如果日期字符串的格式无效,那么字符串“Invalid Date”将不等于原始字符串,如果它要滚动(例如,如果该日当天无效)那么解析的字符串值date不会等于原始字符串。

<强> [编辑]

请注意时区修复所需的示例代码的更改。

答案 1 :(得分:0)

尝试像this这样的正则表达式。 编辑:这是您想要匹配的字符串:

^([1-3][0-9]{3,3})-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][1-9]|3[0-1])\s([0-1][0-9]|2[0-4]):([0-5][0-9]):([0-5][0-9])$

答案 2 :(得分:0)

您可以使用this regex

/^([0-9]{4})-([0-1][0-9])-([0-3][0-9])\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$/.test("2007-08-04 18:01:01"); //true
/^([0-9]{4})-([0-1][0-9])-([0-3][0-9])\s([0-1][0-9]|[2][0-3]):([0-5][0-9]):([0-5][0-9])$/.test("2007-08-04 18:01:0"); //false

答案 3 :(得分:0)

以下代码将检查日期输入是否实际上是有效日期。

乍一看它看起来很大,但主要是评论。

它不需要子串,也不需要正则表达式。

JavaScript的工作方式是,如果将具有无效日期(Date)的04/32/2010对象分解为总毫秒,然后创建另一个Date对象使用这些毫秒,它不会创建显示错误日期(Date)的04/32/2010对象,它将补偿并创建正确的Date05/01/2010)。

简单地说,如果输入与新的 Date对象不同,则日期无效。

http://jsfiddle.net/dceast/vmHjN/ - 这是JSFiddle的一个例子。

var compareDate, checkDates = false;
var validateObject = {
    init: function(year, month, day) {
        return this.compareDate.init(year, month, day);
    },
    compareDate: {
        init: function(year, month, day) {
            var isValid = false;
            // Compensate for zero based index, if month was not
            // subtracted from one 0 === Jan, 1 === Feb, 2 === Mar
            month -= 1;

            // Create a new date object with the selected
            // year, month, and day values and retrieve the
            // milliseconds from it.
            var mSeconds = (new Date(year, month, day)).getTime();
            var objDate = new Date();

            // Set the time of the object to the milliseconds 
            // retrieved from the original date. This will
            // convert it to a valid date.
            objDate.setTime(mSeconds);

            // Compare if the date has changed, if it has then
            // the date is not valid 
            if (objDate.getFullYear() === year &&
                objDate.getMonth() === month &&
                objDate.getDate() === day) 
            {
                isValid = true;
            }
            return isValid;
        }
    }
};

答案 4 :(得分:0)

我这样做了并且有效

<html>
<head>
<title>valida data</title>
<script>
function valData(data){//dd/mm/aaaa

day = data.substring(0,2);
month = data.substring(3,5);
year = data.substring(6,10);

if( (month==01) || (month==03) || (month==05) || (month==07) || (month==08) || (month==10) || (month==12) )    {//months 31 days
if( (day < 01) || (day > 31) ){
alert('invalid date');
}
} else

if( (month==04) || (month==06) || (month==09) || (month==11) ){//months 30 days
if( (day < 01) || (day > 30) ){
alert('invalid date');
}
} else

if( (month==02) ){//February and leap year
if( (year % 4 == 0) && ( (year % 100 != 0) || (year % 400 == 0) ) ){
if( (day < 01) || (day > 29) ){
    alert('invalid date');
}
} else {
if( (day < 01) || (day > 28) ){
    alert('invalid date');
}
}
}

}
</script>
</head>
<body>
<form>
<input type="text" name="data" id="data" onBlur="return valData(this.value)" />
</form>
</body>
</html>