在JavaScript中解释用户输入的日期
我正在寻找一种方便的方法来获取用户输入的日期并执行以下操作: 1) 确定输入的日期是否有效,如果有效,则返回包含以下内容的对象: 2) JavaScript日期对象 3) 以mySQL格式格式化的日期(YYYY-MM-DD) 4) 以典型格式(MM-DD-YYYY)格式化的日期 最后,我编写了自己的函数,该函数使用正则表达式,可以处理YYYY-MM-DD、YYYY/MM/DD、MM-DD-YY、MM/DD/YY、MM-DD-YYYY或MM/DD/YYYY的输入 函数在对象中返回mySQL格式和常规格式的原因只是为了方便。我的web应用程序需要在字段中显示典型格式,在保存数据时需要将mysQL格式发送到服务器 我的答案中显示了代码。我确信有一些方法可以优化代码,但为了便于阅读,我编写了部分代码。即使将它设置为每次用户在日期字段中输入数据时都运行,它也不会使任何事情陷入困境。希望这对某人有帮助 更新:更好 代码和示例可以在这里看到在JavaScript中解释用户输入的日期,javascript,date,input,format,interpreter,Javascript,Date,Input,Format,Interpreter,我正在寻找一种方便的方法来获取用户输入的日期并执行以下操作: 1) 确定输入的日期是否有效,如果有效,则返回包含以下内容的对象: 2) JavaScript日期对象 3) 以mySQL格式格式化的日期(YYYY-MM-DD) 4) 以典型格式(MM-DD-YYYY)格式化的日期 最后,我编写了自己的函数,该函数使用正则表达式,可以处理YYYY-MM-DD、YYYY/MM/DD、MM-DD-YY、MM/DD/YY、MM-DD-YYYY或MM/DD/YYYY的输入 函数在对象中返回mySQL格式和常
函数解释日期(stringDate){
var mysqlF=“(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})”;
var dispF=“(\\d{1,2})[-/](\\d{1,2})[-/]((?:\\d{4})|(?:\\d{2}))”;
var dispNoYearF=“(\\d{1,2})[-/](\\d{1,2})”;
var dateFormats=“(^“+mysqlF+”$)|(^“+dispF+”$)|(^“+dispnoyerf+”$)”;
//让我们试着提取数据
数据=stringDate.match(日期格式);
风险值月份=-1;
var日=-1;
风险值年份=-1;
//检查验证是否失败
如果(数据==未定义){
//无效日期
返回{valid:false,date:null,mysqlDate:null,displayDate:”“};
}
//根据条目类型提取数据
如果(数据[1]!=未定义){//YYYY-MM-DD
月=parseInt(数据[3]);
day=parseInt(数据[4]);
年份=parseInt(数据[2]);
}如果(数据[5]!=未定义){//MM-DD-YYYY或MM-DD-YY
月=parseInt(数据[6]);
day=parseInt(数据[7]);
年份=parseInt(数据[8]);
如果(年份<100){
var yearString=新字符串(new Date().getFullYear());
year=parseInt(yearString.substr(0,2)+year);
}
}如果(数据[9]!=未定义){//MM-DD
月=parseInt(数据[10]);
day=parseInt(数据[11]);
year=parseInt(新日期().getFullYear());
}
//如果我们在这里,我们有三个数字,让我们看看他们是否真的有约会
var extractedDate=新日期(年、月1日);
如果(extractedDate.getFullYear()!=年| | extractedDate.getDate()!=天| | extractedDate.getMonth()!=(第1个月)){
返回{valid:false,date:null,mysqlDate:null,displayDate:”“};
}
//我们有一个有效的日期,让我们加上前面的零
var monthFixed=月份;
如果(monthFixed<10)monthFixed=“0”+monthFixed;
var dayFixed=天;
如果(dayFixed<10)dayFixed=“0”+dayFixed;
//我们完了
返回{valid:true,date:extractedDate,mysqlDate:year+“-”+monthFixed+“-”+dayFixed,displayDate:month+“/”+day+“/”+year};
}
function interpretDate(stringDate){
var mysqlF = "(\\d{4})[-/](\\d{1,2})[-/](\\d{1,2})";
var dispF = "(\\d{1,2})[-/](\\d{1,2})[-/]((?:\\d{4})|(?:\\d{2}))";
var dispNoYearF = "(\\d{1,2})[-/](\\d{1,2})";
var dateFormats = "(^"+mysqlF+"$)|(^"+dispF+"$)|(^"+dispNoYearF+"$)";
//Let's try to extract the data
data = stringDate.match(dateFormats);
var month = -1;
var day = -1;
var year = -1;
//Check to see if the verification failed
if (data == undefined){
//Invalid date
return {valid: false, date: null, mysqlDate:null, displayDate: ""};
}
//Extract the data based on the entry type
if (data[1] != undefined){//YYYY-MM-DD
month = parseInt(data[3]);
day = parseInt(data[4]);
year = parseInt(data[2]);
}else if (data[5] != undefined){//MM-DD-YYYY or MM-DD-YY
month = parseInt(data[6]);
day = parseInt(data[7]);
year = parseInt(data[8]);
if (year < 100){
var yearString = new String(new Date().getFullYear());
year = parseInt(yearString.substr(0,2) + year);
}
}else if (data[9] != undefined){//MM-DD
month = parseInt(data[10]);
day = parseInt(data[11]);
year = parseInt(new Date().getFullYear());
}
//If we are here, we have three numbers, let's see if they make a real date
var extractedDate = new Date(year, month-1, day);
if (extractedDate.getFullYear() != year || extractedDate.getDate() != day || extractedDate.getMonth() != (month-1)){
return {valid: false, date: null, mysqlDate:null, displayDate: ""};
}
//We have a valid date, let's add front zeros
var monthFixed = month;
if (monthFixed < 10) monthFixed = "0"+monthFixed;
var dayFixed = day;
if (dayFixed < 10) dayFixed = "0"+dayFixed;
//We are done
return {valid: true, date: extractedDate, mysqlDate:year+"-"+monthFixed+"-"+dayFixed, displayDate: month+"/"+day+"/"+year};
}