我对Javascript很新,我正在努力确保在文本框中输入的日期(我没有使用过的数字作为即时播放)并不比今天的日期少。我想我已经过度复杂了,请你帮我解决这个问题。
我首先阅读用户日期并将用户输入分成dd / mm / yyyy
//date regex ensures day and month != 00 && is a valid date
var dateformat = /^(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])
[\/\-]\d{4}$/;;
//store user date
var readDate = document.getElementById("myDate").value;
//if date is valid
if(dateformat.test(readDate))
{
var day = splitDate[0];
var month = splitDate[1];
var year = splitDate[2];
var dateToday = new Date()
var dd = dateToday.getDate()
var mm = dateToday.getMonth() + 1
var yyyy = dateToday.getFullYear()
console.log('date today is: ' + dd + '/' + mm + '/' + yyyy);
if(day > dd)
{
if(month >= mm)
{
if(year >= yyyy)
{
console.log('it works - continue')
return true;
}
else
{
console.log('old year')
return false;
}
}
else
{
console.log('old month')
return false;
}
}
else
{
console.log('old day')
return false;
}
}
else
{
console.log('invalid date')
}
我知道这非常非常脏,但我对逻辑非常困惑,在专家开始使用lambdas等之前,我也不习惯,我只是想找出为什么这不起作用?以及如何让它工作?肯定是
我写了这篇文章,但它仍然没有帮助我
日期在以下时间有效: 用户日>当天
User month > = current month
User year > = current year
今天的日期= 21/11/2017
因此,如果用户输入:
21/11/2017 not valid
02/03/2017 not valid
22/12/2017 valid
但它不起作用
为什么哦为什么?
让我过度复杂吗?
如果知道为什么它不能以一种非常简单易行的方式运作,那就太棒了
谢谢
P.S。如果有一个更简单的方法,但保持我的dateformat,readDate和splitDate完整,请你帮我找到它?感谢
答案 0 :(得分:0)
使用moment熟知的库。
以下是一个例子:
PS: 我已将当日开始作为支票的参考。
// This is your user date
const readDate = '21/11/2017';
// We gives the date to moment library and ask if the date is ok
// For the library to know about which date structure to look for we tell it
if (!moment(readDate, 'DD/MM/YYYY').isValid()) {
console.log('Wrong format!');
}
// We transform the date into a Timestamp
// (number of milisecond since st january 1970)
// In order to perform a comparaison with the timestamp of the start of the day
if (moment(readDate, 'DD/MM/YYYY').valueOf() >= moment().startOf('day').valueOf()) {
console.log('Good');
} else {
console.log('Bad');
}
<!DOCTYPE html>
<html>
<head>
<!-- reference Moment.js library -->
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.7.0/moment.min.js" type="text/javascript"></script>
</head>
<body>
答案 1 :(得分:0)
有很多更清洁的方法可以为您检查,但我们可以谈谈您的逻辑
您正在将日期和年份测试嵌套在日期测试块中,因此当您插入日期值较低的日期时,今天它甚至不会测试月/年值是否大于今天的值。
您可以根据输入创建新日期:
let inputDate = new Date(year, month, day, 0, 0, 0, 0)
从您今天的日期开始的新日期:
let todayDate = new Date(yyyy, mm, dd, 0, 0, 0, 0)
并比较:
if (inputDate > todayDate)
答案 2 :(得分:0)
我重构了你的代码。这可以帮助您获得预期的输出。
$(function(){
var dateFormat = /^(?:(?:31(\/)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/; //date formats /
$("#check").on("click", function(){
dateValidate(dateFormat);
});
});
function dateValidate(dateFormat){
var readDate = document.getElementById("myDate").value;
//if date is valid
if(dateFormat.test(readDate))
{
var splitDate = readDate.split("/");
var day = splitDate[0];
var month = splitDate[1];
var year = splitDate[2];
var dateToday = new Date();
var dd = dateToday.getDate();
var mm = dateToday.getMonth() + 1;
var yyyy = dateToday.getFullYear();
console.log('Date Today is: ' + dd + '/' + mm + '/' + yyyy);
if(day > dd)
{
if(month >= mm)
{
if(year >= yyyy)
{
console.log('it works - continue')
return true;
}
else
{
console.log('Old Year');
return false;
}
}
else
{
console.log('Old Month');
return false;
}
}
else
{
console.log('Old Day')
return false;
}
}
else
{
console.log('Invalid Date');
$("#myDate").focus();
return false;
}
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="dateField">
<input type="text" id="myDate" placeholder="dd/mm/yyyy"/>
<button id="check">Check</button>
</div>
&#13;