问题描述
|
我想使用格式“ 0”验证输入的日期格式。
我在一个站点中找到以下代码,然后使用了它,但是它不起作用:
function isDate(ExpiryDate) {
var objDate,// date object initialized from the ExpiryDate string
mSeconds,// ExpiryDate in milliseconds
day,// day
month,// month
year; // year
// date length should be 10 characters (no more no less)
if (ExpiryDate.length !== 10) {
return false;
}
// third and sixth character should be \'/\'
if (ExpiryDate.substring(2,3) !== \'/\' || ExpiryDate.substring(5,6) !== \'/\') {
return false;
}
// extract month,day and year from the ExpiryDate (expected format is mm/dd/yyyy)
// subtraction will cast variables to integer implicitly (needed
// for !== comparing)
month = ExpiryDate.substring(0,2) - 1; // because months in JS start from 0
day = ExpiryDate.substring(3,5) - 0;
year = ExpiryDate.substring(6,10) - 0;
// test year range
if (year < 1000 || year > 3000) {
return false;
}
// convert ExpiryDate to milliseconds
mSeconds = (new Date(year,month,day)).getTime();
// initialize Date() object from calculated milliseconds
objDate = new Date();
objDate.setTime(mSeconds);
// compare input date and parts from Date() object
// if difference exists then date isn\'t valid
if (objDate.getFullYear() !== year ||
objDate.getMonth() !== month ||
objDate.getDate() !== day) {
return false;
}
// otherwise return true
return true;
}
function checkDate(){
// define date string to test
var ExpiryDate = document.getElementById(\' ExpiryDate\').value;
// check date and print message
if (isDate(ExpiryDate)) {
alert(\'OK\');
}
else {
alert(\'Invalid date format!\');
}
}
关于什么可能是错的任何建议?
解决方法
我认为Niklas对您的问题有正确的答案。除此之外,我认为以下日期验证功能更易于阅读:
// Validates that the input string is a valid date formatted as \"mm/dd/yyyy\"
function isValidDate(dateString)
{
// First check for the pattern
if(!/^\\d{1,2}\\/\\d{1,2}\\/\\d{4}$/.test(dateString))
return false;
// Parse the date parts to integers
var parts = dateString.split(\"/\");
var day = parseInt(parts[1],10);
var month = parseInt(parts[0],10);
var year = parseInt(parts[2],10);
// Check the ranges of month and year
if(year < 1000 || year > 3000 || month == 0 || month > 12)
return false;
var monthLength = [ 31,28,31,30,31 ];
// Adjust for leap years
if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
monthLength[1] = 29;
// Check the range of the day
return day > 0 && day <= monthLength[month - 1];
};
, 我将使用Moment.js进行日期验证。
alert(moment(\"05/22/2012\",\'MM/DD/YYYY\',true).isValid()); //true
Jsfiddle:http://jsfiddle.net/q8y9nbu5/
, 使用以下正则表达式进行验证:
var date_regex = /^(0[1-9]|1[0-2])\\/(0[1-9]|1\\d|2\\d|3[01])\\/(19|20)\\d{2}$/;
if (!(date_regex.test(testDate))) {
return false;
}
这对我来说适合MM / dd / yyyy。
, 所有学分归elian-ebbing
我只为那些懒惰的人提供格式为yyyy-mm-dd的函数的定制版本。
function isValidDate(dateString)
{
// First check for the pattern
var regex_date = /^\\d{4}\\-\\d{1,2}\\-\\d{1,2}$/;
if(!regex_date.test(dateString))
{
return false;
}
// Parse the date parts to integers
var parts = dateString.split(\"-\");
var day = parseInt(parts[2],10);
var month = parseInt(parts[1],10);
var year = parseInt(parts[0],10);
// Check the ranges of month and year
if(year < 1000 || year > 3000 || month == 0 || month > 12)
{
return false;
}
var monthLength = [ 31,31 ];
// Adjust for leap years
if(year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))
{
monthLength[1] = 29;
}
// Check the range of the day
return day > 0 && day <= monthLength[month - 1];
}
, 你可以用Date.parse()
您可以阅读MDN文档
Date.parse()方法解析日期的字符串表示形式,然后
返回自UTC 1970年1月1日00:00:00以来的毫秒数
或NaN(如果字符串无法识别,或者在某些情况下包含
非法的日期值(例如2015-02-31)。
并检查Date.parse
的结果是否为NaN
let isValidDate = Date.parse(\'01/29/1980\');
if (isNaN(isValidDate)) {
// when is not valid date logic
return false;
}
// when is valid date logic
建议您何时在MDN中使用Date.parse
, 对于mm / dd / yyyy格式日期,它似乎工作正常,例如:
http://jsfiddle.net/niklasvh/xfrLm/
我的代码唯一的问题是:
var ExpiryDate = document.getElementById(\' ExpiryDate\').value;
元素ID之前的方括号内有一个空格。更改为:
var ExpiryDate = document.getElementById(\'ExpiryDate\').value;
如果没有有关无法正常工作的数据类型的更多详细信息,则没有太多其他信息可以输入。
, 如果给定的字符串格式正确(\'MM / DD / YYYY \'),则该函数将返回true,否则将返回false。 (我在网上找到了此代码,并对其做了一些修改)
function isValidDate(date) {
var temp = date.split(\'/\');
var d = new Date(temp[2] + \'/\' + temp[0] + \'/\' + temp[1]);
return (d && (d.getMonth() + 1) == temp[0] && d.getDate() == Number(temp[1]) && d.getFullYear() == Number(temp[2]));
}
console.log(isValidDate(\'02/28/2015\'));
, 这是一个检查有效日期的代码段:
function validateDate(dateStr) {
const regExp = /^(\\d\\d?)\\/(\\d\\d?)\\/(\\d{4})$/;
let matches = dateStr.match(regExp);
let isValid = matches;
let maxDate = [0,29,31];
if (matches) {
const month = parseInt(matches[1]);
const date = parseInt(matches[2]);
const year = parseInt(matches[3]);
isValid = month <= 12 && month > 0;
isValid &= date <= maxDate[month] && date > 0;
const leapYear = (year % 400 == 0)
|| (year % 4 == 0 && year % 100 != 0);
isValid &= month != 2 || leapYear || date <= 28;
}
return isValid
}
console.log([\'1/1/2017\',\'01/1/2017\',\'1/01/2017\',\'01/01/2017\',\'13/12/2017\',\'13/13/2017\',\'12/35/2017\'].map(validateDate));
, 如果您要检查验证dd / MM / yyyy没关系
function isValidDate(date) {
var temp = date.split(\'/\');
var d = new Date(temp[1] + \'/\' + temp[0] + \'/\' + temp[2]);
return (d && (d.getMonth() + 1) == temp[1] && d.getDate() == Number(temp[0]) && d.getFullYear() == Number(temp[2]));
}
alert(isValidDate(\'29/02/2015\')); // it not exist ---> false
, 在下面的代码中查找,该代码可对提供的任何格式执行日期验证,以验证开始/起始日期和结束/起始日期。可能会有一些更好的方法,但是已经提出了。注意提供的日期格式和日期字符串是齐头并进的。
<script type=\"text/javascript\">
function validate() {
var format = \'yyyy-MM-dd\';
if(isAfterCurrentDate(document.getElementById(\'start\').value,format)) {
alert(\'Date is after the current date.\');
} else {
alert(\'Date is not after the current date.\');
}
if(isBeforeCurrentDate(document.getElementById(\'start\').value,format)) {
alert(\'Date is before current date.\');
} else {
alert(\'Date is not before current date.\');
}
if(isCurrentDate(document.getElementById(\'start\').value,format)) {
alert(\'Date is current date.\');
} else {
alert(\'Date is not a current date.\');
}
if (isBefore(document.getElementById(\'start\').value,document.getElementById(\'end\').value,format)) {
alert(\'Start/Effective Date cannot be greater than End/Expiration Date\');
} else {
alert(\'Valid dates...\');
}
if (isAfter(document.getElementById(\'start\').value,format)) {
alert(\'End/Expiration Date cannot be less than Start/Effective Date\');
} else {
alert(\'Valid dates...\');
}
if (isEquals(document.getElementById(\'start\').value,format)) {
alert(\'Dates are equals...\');
} else {
alert(\'Dates are not equals...\');
}
if (isDate(document.getElementById(\'start\').value,format)) {
alert(\'Is valid date...\');
} else {
alert(\'Is invalid date...\');
}
}
/**
* This method gets the year index from the supplied format
*/
function getYearIndex(format) {
var tokens = splitDateFormat(format);
if (tokens[0] === \'YYYY\'
|| tokens[0] === \'yyyy\') {
return 0;
} else if (tokens[1]=== \'YYYY\'
|| tokens[1] === \'yyyy\') {
return 1;
} else if (tokens[2] === \'YYYY\'
|| tokens[2] === \'yyyy\') {
return 2;
}
// Returning the default value as -1
return -1;
}
/**
* This method returns the year string located at the supplied index
*/
function getYear(date,index) {
var tokens = splitDateFormat(date);
return tokens[index];
}
/**
* This method gets the month index from the supplied format
*/
function getMonthIndex(format) {
var tokens = splitDateFormat(format);
if (tokens[0] === \'MM\'
|| tokens[0] === \'mm\') {
return 0;
} else if (tokens[1] === \'MM\'
|| tokens[1] === \'mm\') {
return 1;
} else if (tokens[2] === \'MM\'
|| tokens[2] === \'mm\') {
return 2;
}
// Returning the default value as -1
return -1;
}
/**
* This method returns the month string located at the supplied index
*/
function getMonth(date,index) {
var tokens = splitDateFormat(date);
return tokens[index];
}
/**
* This method gets the date index from the supplied format
*/
function getDateIndex(format) {
var tokens = splitDateFormat(format);
if (tokens[0] === \'DD\'
|| tokens[0] === \'dd\') {
return 0;
} else if (tokens[1] === \'DD\'
|| tokens[1] === \'dd\') {
return 1;
} else if (tokens[2] === \'DD\'
|| tokens[2] === \'dd\') {
return 2;
}
// Returning the default value as -1
return -1;
}
/**
* This method returns the date string located at the supplied index
*/
function getDate(date,index) {
var tokens = splitDateFormat(date);
return tokens[index];
}
/**
* This method returns true if date1 is before date2 else return false
*/
function isBefore(date1,date2,format) {
// Validating if date1 date is greater than the date2 date
if (new Date(getYear(date1,getYearIndex(format)),getMonth(date1,getMonthIndex(format)) - 1,getDate(date1,getDateIndex(format))).getTime()
> new Date(getYear(date2,getMonth(date2,getDate(date2,getDateIndex(format))).getTime()) {
return true;
}
return false;
}
/**
* This method returns true if date1 is after date2 else return false
*/
function isAfter(date1,format) {
// Validating if date2 date is less than the date1 date
if (new Date(getYear(date2,getDateIndex(format))).getTime()
< new Date(getYear(date1,getDateIndex(format))).getTime()
) {
return true;
}
return false;
}
/**
* This method returns true if date1 is equals to date2 else return false
*/
function isEquals(date1,format) {
// Validating if date1 date is equals to the date2 date
if (new Date(getYear(date1,getDateIndex(format))).getTime()
=== new Date(getYear(date2,getDateIndex(format))).getTime()) {
return true;
}
return false;
}
/**
* This method validates and returns true if the supplied date is
* equals to the current date.
*/
function isCurrentDate(date,format) {
// Validating if the supplied date is the current date
if (new Date(getYear(date,getMonth(date,getDate(date,getDateIndex(format))).getTime()
=== new Date(new Date().getFullYear(),new Date().getMonth(),new Date().getDate()).getTime()) {
return true;
}
return false;
}
/**
* This method validates and returns true if the supplied date value
* is before the current date.
*/
function isBeforeCurrentDate(date,format) {
// Validating if the supplied date is before the current date
if (new Date(getYear(date,getDateIndex(format))).getTime()
< new Date(new Date().getFullYear(),new Date().getDate()).getTime()) {
return true;
}
return false;
}
/**
* This method validates and returns true if the supplied date value
* is after the current date.
*/
function isAfterCurrentDate(date,getDateIndex(format))).getTime()
> new Date(new Date().getFullYear(),new Date().getDate()).getTime()) {
return true;
}
return false;
}
/**
* This method splits the supplied date OR format based
* on non alpha numeric characters in the supplied string.
*/
function splitDateFormat(dateFormat) {
// Spliting the supplied string based on non characters
return dateFormat.split(/\\W/);
}
/*
* This method validates if the supplied value is a valid date.
*/
function isDate(date,format) {
// Validating if the supplied date string is valid and not a NaN (Not a Number)
if (!isNaN(new Date(getYear(date,getDateIndex(format))))) {
return true;
}
return false;
}
</script>
以下是HTML代码段
<input type=\"text\" name=\"start\" id=\"start\" size=\"10\" value=\"\" />
<br/>
<input type=\"text\" name=\"end\" id=\"end\" size=\"10\" value=\"\" />
<br/>
<input type=\"button\" value=\"Submit\" onclick=\"javascript:validate();\" />
, 我从此处找到的另一篇文章中提取了大部分代码。我已经为我的目的对其进行了修改。这对我需要的效果很好。这可能会帮助您解决问题。
$(window).load(function() {
function checkDate() {
var dateFormat = /^(0?[1-9]|[12][0-9]|3[01])[\\/\\-](0?[1-9]|1[012])[\\/\\-]\\d{4}$/;
var valDate = $(this).val();
if ( valDate.match( dateFormat )) {
$(this).css(\"border\",\"1px solid #cccccc\",\"color\",\"#555555\",\"font-weight\",\"normal\");
var seperator1 = valDate.split(\'/\');
var seperator2 = valDate.split(\'-\');
if ( seperator1.length > 1 ) {
var splitdate = valDate.split(\'/\');
} else if ( seperator2.length > 1 ) {
var splitdate = valDate.split(\'-\');
}
var dd = parseInt(splitdate[0]);
var mm = parseInt(splitdate[1]);
var yy = parseInt(splitdate[2]);
var ListofDays = [31,31];
if ( mm == 1 || mm > 2 ) {
if ( dd > ListofDays[mm - 1] ) {
$(this).val(\"\");
$(this).css(\"border\",\"solid red 1px\",\"red\",\"bold\");
alert(\'Invalid Date! You used a date which does not exist in the known calender.\');
return false;
}
}
if ( mm == 2 ) {
var lyear = false;
if ( (!(yy % 4) && yy % 100) || !(yy % 400) ){
lyear = true;
}
if ( (lyear==false) && (dd>=29) ) {
$(this).val(\"\");
$(this).css(\"border\",\"bold\");
alert(\'Invalid Date! You used Feb 29th for an invalid leap year\');
return false;
}
if ( (lyear==true) && (dd>29) ) {
$(this).val(\"\");
$(this).css(\"border\",\"bold\");
alert(\'Invalid Date! You used a date greater than Feb 29th in a valid leap year\');
return false;
}
}
} else {
$(this).val(\"\");
$(this).css(\"border\",\"bold\");
alert(\'Date format was invalid! Please use format mm/dd/yyyy\');
return false;
}
};
$(\'#from_date\').change( checkDate );
$(\'#to_date\').change( checkDate );
});
, 与Elian Ebbing答案相似,但支持\“ \\\”,\“ / \”,\“。\”,\“-\”,\“ \”分隔符
function js_validate_date_dmyyyy(js_datestr)
{
var js_days_in_year = [ 0,31 ];
var js_datepattern = /^(\\d{1,2})([\\.\\-\\/\\\\ ])(\\d{1,2})([\\.\\-\\/\\\\ ])(\\d{4})$/;
if (! js_datepattern.test(js_datestr)) { return false; }
var js_match = js_datestr.match(js_datepattern);
var js_day = parseInt(js_match[1]);
var js_delimiter1 = js_match[2];
var js_month = parseInt(js_match[3]);
var js_delimiter2 = js_match[4];
var js_year = parseInt(js_match[5]);
if (js_is_leap_year(js_year)) { js_days_in_year[2] = 29; }
if (js_delimiter1 !== js_delimiter2) { return false; }
if (js_month === 0 || js_month > 12) { return false; }
if (js_day === 0 || js_day > js_days_in_year[js_month]) { return false; }
return true;
}
function js_is_leap_year(js_year)
{
if(js_year % 4 === 0)
{
if(js_year % 100 === 0)
{
if(js_year % 400 === 0)
{
return true;
}
else return false;
}
else return true;
}
return false;
}
, function fdate_validate(vi)
{
var parts =vi.split(\'/\');
var result;
var mydate = new Date(parts[2],parts[1]-1,parts[0]);
if (parts[2] == mydate.getYear() && parts[1]-1 == mydate.getMonth() && parts[0] == mydate.getDate() )
{result=0;}
else
{result=1;}
return(result);
}
, 片刻确实是解决它的一个好方法。我看不出增加复杂性只是为了检查日期的原因……请看一下时刻:http://momentjs.com/
HTML:
<input class=\"form-control\" id=\"date\" name=\"date\" onchange=\"isValidDate(this);\" placeholder=\"DD/MM/YYYY\" type=\"text\" value=\"\">
剧本:
function isValidDate(dateString) {
var dateToValidate = dateString.value
var isValid = moment(dateToValidate,true).isValid()
if (isValid) {
dateString.style.backgroundColor = \'#FFFFFF\';
} else {
dateString.style.backgroundColor = \'#fba\';
}
};
, 首先将字符串日期转换为js日期格式,然后再次转换为字符串格式,然后将其与原始字符串进行比较。
function dateValidation(){
var dateString = \"34/05/2019\"
var dateParts = dateString.split(\"/\");
var date= new Date(+dateParts[2],dateParts[1] - 1,+dateParts[0]);
var isValid = isValid( dateString,date );
console.log(\"Is valid date: \" + isValid);
}
function isValidDate(dateString,date) {
var newDateString = ( date.getDate()<10 ? (\'0\'+date.getDate()) : date.getDate() )+ \'/\'+ ((date.getMonth() + 1)<10? (\'0\'+(date.getMonth() + 1)) : (date.getMonth() + 1) ) + \'/\' + date.getFullYear();
return ( dateString == newDateString);
}
, var date = new Date(date_string)
对于任何无效的date_string返回字面量“ 24”。
注意:请参阅下面的评论。