仅使用大于今天的日期

时间:2017-11-21 17:05:49

标签: javascript

我对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完整,请你帮我找到它?感谢

3 个答案:

答案 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)

我重构了你的代码。这可以帮助您获得预期的输出。

&#13;
&#13;
$(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;
&#13;
&#13;