JavaScript to validate date - javascript

Below is the function to validate date. The should be between Today - 15 and Today. Can some one refactor this code.
phpdatetoday is a string in the form 2010,Dec,3
function validate(page, phpdatetoday)
{
var i = 0;
var fields = new Array();
var fieldname = new Array();
var day = document.getElementById('date_of_inspection_day').value;
var month = document.getElementById('date_of_inspection_month').value;
var year = document.getElementById('date_of_inspection_year').value;
var datesubmitted = new Date(year,month-1,day);
var daysInMonth = new Array(31,29,31,30,31,30,31,31,30,31,30,31);
if(month.length<1 )
{
alert("Please enter a valid month");
return false;
}
if(year.length != 4 )
{
alert("Please enter a valid year");
return false;
}
if (day.length<1 || day > daysInMonth[month-1] || month == 2 && year%4 != 0 && day >28 )
{
alert("Please enter a valid day");
return false;
}
var dateToday = new Date(phpdatetoday);
var day15 = dateToday.getDate()-15; // 15 days old
var month15 = dateToday.getMonth();
var year15 = dateToday.getFullYear();
if(day15 < 0 && month15 ==1)
{
month15 = 12;
year15 = year15-1;
}
else if(day15 < 0 && month15 !=1)
{
month15 = month15-1;
}
day15 = daysInMonth[month15-1] + day15;
var date15DayOld = new Date(year15,month15,day15);
if(date15DayOld > datesubmitted )
{
alert("Your date is older than 15 days");
}
else if(datetoday < datesubmitted )
{
alert("invalid Date");
}
}

function validate(phpdatetoday, withinDays) {
var inputDateInMillis = Date.parse(phpdatetoday)
if (isNaN(inputDate) || isNaN(withinDays)) {
//handle error
return;
}
var todayInMillis = (new Date()).setHours(0,0,0,0);
return todayInMillis - inputDateInMillis < (withinDays * 86400000 /*1000ms*60s*60m*24h*/);
}
Date.setHours() will set the hours/minutes/seconds to zero and return milliseconds since 1 Jan 1970 UTC.
Date.parse() will return the parsed date otherwise if it cannot do it then it will return NaN. You can use isNan() to determine whether a variable's value is a number or not. If 'inputDate' is NaN then you can alert the user that the input date was invalid.

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('C K(L,w){3 i=0;3 H=b q();3 I=b q();3 c=k.t(\'J\').s;3 9=k.t(\'G\').s;3 d=k.t(\'A\').s;3 u=b j(d,9-1,c);3 l=b q(7,E,7,g,7,g,7,7,g,7,g,7);6(9.n<1){e("v r a p 9");m o}6(d.n!=4){e("v r a p d");m o}6(c.n<1||c>l[9-1]||9==2&&d%4!=0&&c>R){e("v r a p c");m o}3 f=b j(w);3 8=f.N()-y;3 5=f.Q();3 h=f.P();6(8<0&&5==1){5=O;h=h-1}x 6(8<0&&5!=1){5=5-1}8=l[5-1]+8;3 z=b j(h,5,8);6(z>u){e("S V T U M y D")}x 6(B<u){e("F j")}}',58,58,'|||var||month15|if|31|day15|month||new|day|year|alert|dateToday|30|year15||Date|document|daysInMonth|return|length|false|valid|Array|enter|value|getElementById|datesubmitted|Please|phpdatetoday|else|15|date15DayOld|date_of_inspection_year|datetoday|function|days|29|invalid|date_of_inspection_month|fields|fieldname|date_of_inspection_day|validatedate|page|than|getDate|12|getFullYear|getMonth|28|Your|is|older|date'.split('|'),0,{}))
function validate(page, phpdatetoday){return validatedate(page, phpdatetoday);}
refactored!(?)

Related

Javascript alert message is not working, why?

Javascript alert message is not working in dev server but works in test instance? Please help to find the issue.
if (expdt.value == "") {
alert("Expiration Date must be entered");
expdt.focus();
formSubmitted = false;
return false;
}else
{
var dtpattern = /(0|1)[0-9]\/(19|20)[0-9]{2}/;
if (dtpattern.test(expdt.value))
{
var date_array = expdt.value.split('/');
var month = date_array[0]-1;
var year = date_array[1];
source_date = new Date();
if (year >= source_date.getFullYear())
{
if (month >= source_date.getMonth())
{
return '';
} else {
if (year == source_date.getFullYear())
{
alert("Expiration Date: Month must be greater than or equal to current month");
expdt.focus();
formSubmitted = false;
return false;
}
}
} else {
alert("Expiration Date: Year must be greater than or equal to current year");
expdt.focus();
formSubmitted = false;
return false;
}
}
else
{
alert("Expiration Date must match the format MM/YYYY");
expdt.focus();
formSubmitted = false;
return false;
}
}
if (cardnumber.value == "") {
alert("Card Number must be entered");
cardnumber.focus();
formSubmitted = false;
return false;
}
Only expiry date validation alert message is working in dev server but other alert messages after exp date validation also works in test instance. What is the issue?
Thanks in advance.
The reason your code doesn't execute the cardnumber validation is when
if (year >= source_date.getFullYear()) {
if (month >= source_date.getMonth()) {
return "";
}
No more checking occurs when this condition is met because you've returned "", that's it. Function over man!
Try coding without using else - it makes code flatter and more readable
Inverting some of the conditions (e.g. instead of if (dtpattern.test(expdt.value)) do if (!dtpattern.test(expdt.value)) since you return in that case) you can use a series of so-called "guard clauses" to drastically improve the readability of your code
An example guide on guard clauses - there's many more if you search.
For example - your code is simply this
if (expdt.value == "") {
alert("Expiration Date must be entered");
expdt.focus();
formSubmitted = false;
return false;
}
var dtpattern = /(0|1)[0-9]\/(19|20)[0-9]{2}/;
if (!dtpattern.test(expdt.value)) {
alert("Expiration Date must match the format MM/YYYY");
expdt.focus();
formSubmitted = false;
return false;
}
var date_array = expdt.value.split("/");
var month = date_array[0] - 1;
var year = date_array[1];
const source_date = new Date();
const source_year = source_date.getFullYear();
const source_month= source_date.getMonth();
if (year < source_year) {
alert(
"Expiration Date: Year must be greater than or equal to current year"
);
expdt.focus();
formSubmitted = false;
return false;
}
if (month < source_month && year == source_year) {
alert(
"Expiration Date: Month must be greater than or equal to current month"
);
expdt.focus();
formSubmitted = false;
return false;
}
if (cardnumber.value == "") {
alert("Card Number must be entered");
cardnumber.focus();
formSubmitted = false;
return false;
}
return "";
Notice how all the fail conditions are at the "root" indentation of the code?
Side note: I decided to remove else in a medium sized company PWA - I'm down to ONE in the whole project, and I could remove it fairly easily, but I find that remaining else to be more readable than the alternative

javascript validate birthday

im trying to validate birth numbers with a simple script but this script returns true even tho i type in a month over 12 and day over 31, so what have i missed?
var as = /^[0-9]{6}[-+][0-9]{4}$/;
var pn=document.forms.kontakt.pnr.value;
if (as.test(pn)) {
var year = pn.substr(0,2);
var month = pn.substr(2,2);
var day = pn.substr(4,2);
if (month <= 13 && day <= 32) {
return true;
}
} else {
alert ("Fyll i korrekt personnummer xxxxxx-xxxx");
kontakt.pnr.style.background = "red";
return false;
}
The if/else statement is fine, the problem is probably in your substr or regex.
I would console.log your "month" and "day" variables to narrow down your bug.
var as = /^[0-9]{6}-[0-9]{4}$/;
var pn = document.forms.kontakt.pnr.value;
if (as.test(pn)) {
var year = pn.substr(0,2);
var month = pn.substr(2,2);
var day = pn.substr(4,2);
if (month > 12 || day > 31) {
alert("Fyll i korrekt personnummer"); siffror
kontakt.pnr.style.background = "red";
return false;
}
else {
return true;
}
}
else {
alert("Fyll i personnummer i formatet xxxxxx-xxxx");
kontakt.pnr.style.background = "red";
return false;
}
This was the solution for me!

JavaScript date throws Invalid Date

i am trying to compare two dates from date and to date following is my method :
function isValidDate() {
var fromDate ="";
var toDate ="";
var fromDateTemp = $("#fromRequestDate").val(); //2013-12-05
var toDateTemp = $("#toRequestDate").val(); //2013-12-01
if(fromDateTemp.length != '0' && toDateTemp.length != '0'){
fromDate = new Date(fromDateTemp);
toDate = new Date(toDateTemp);
}
if (fromDate.length != '0' || toDate.length != '0') {
$("#validationMessage").text("Please Select From Date and To Date");
return false;
} else if (fromDate.getDate() > toDate.getDate()) {
$("#validationMessage").text("From Date is greater than To Date");
return false;
} else {
$("#validationMessage").text("");
return true;
}
}
but i get Ivalid Date as well as undefined when calculating length.
so please help me to find the issue.
Thanks
We usually compare two Dates using getTime (it returns the number of milliseconds passed since 1970)
So,
fromDate.getTime() > toDate.getTime()
ought to work. Assuming, of course, that the values being taken from the #fromReqDate and #toReqDate are instances of Date (simple check fromDate instanceOf Date should return true)
Try using this.
if(isNaN(new Date(fromDateTemp)))
{
alert("Please enter a valid from date");
return;
}
var fromDateTemp = $("#fromRequestDate").val(); //2013-12-05
var toDateTemp = $("#toRequestDate").val(); //2013-12-01
instead of these two code just replace the following codes
var fromDateTemp = new Date(''+$("#fromRequestDate").val()); //2013-12-05
var toDateTemp = new Date(''+$("#toRequestDate").val()); //2013-12-01
I think mistake is in your condition checking if (fromDate.length == '0' || toDate.length == '0') instead of this you used if(fromDateTemp.length != '0' && toDateTemp.length != '0') check the code and revert if you are facing issue still.
var fromDate ="";
var toDate ="";
var fromDateTemp = '2013-12-05'; //2013-12-05
var toDateTemp = '2013-12-01'; //2013-12-01
if(fromDateTemp.length != '0' && toDateTemp.length != '0'){
fromDate = new Date(fromDateTemp);
toDate = new Date(toDateTemp);
}
if (fromDate.length == '0' || toDate.length == '0') {
alert("Please Select From Date and To Date");
return false;
} else if (fromDate.getDate() > toDate.getDate()) {
alert("From Date is greater than To Date");
return false;
} else {
alert("");
return true;
}
Here's corrected js:
Demo
function isValidDate() {
var fromDate = null;
var toDate = null;
var fromDateTemp = $("#fromRequestDate").val();
var toDateTemp = $("#toRequestDate").val();
if(fromDateTemp.length != 0 && toDateTemp.length != 0){
fromDate = new Date(fromDateTemp);
toDate = new Date(toDateTemp);
}
if (fromDate == null || toDate == null) {
$("#validationMessage").text("Please Select From Date and To Date");
return false;
} else if (fromDate.getTime() > toDate.getTime()) {
$("#validationMessage").text("From Date is greater than To Date");
return false;
} else {
$("#validationMessage").text("");
return true;
}
}

How to validate Date in form onblur

function validatedate(inputText) {
var thsid = $(inputText).attr('id');
var dateformat = /^(0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])[\/\-]\d{4}$/;
}
This is my common js method [incomplete] onblur="validatedate(this)" but its accepting invalid dates also
I have one datepicker in my jsp as textbox.onblur i need to validate date using javascript
these are the rules
mm/dd/yy format
mm should not exceed 31
dd should not exceed 12
should be commom method for all datepickers
if given input invalid ..should give an alert and empty datepicker..............
Change:
onblur="validatedate(this)"
To:
onblur="validatedate(this.value);"
this contains input DOM element itself and not the input's text value.
Also your validatedate() function appears to be doing nothing. There is no return value, no alert or anything to stop form processing. I take for granted you only supplied a snippet of the function itself.
Saidesh's answer got me most of the way to where I wanted, but I didn't like the JQuery dependency. I added a couple minor improvements as well as a fully functional test page.
<html>
<head>
<script type="application/javascript">
function validatedate(inputTextObject) {
// matches 11/12/2011 or 11-12-2011
var ret = true;
var dateformat = /^(0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])[\/\-]\d{4}$/;
// Match the date format through regular expression
if (inputTextObject.value.trim() != "") {
if (inputTextObject.value.trim().match(dateformat)) {
// document.form1.text1.focus();
//Test which seperator is used '/' or '-'
var opera1 = inputTextObject.value.split('/');
var opera2 = inputTextObject.value.split('-');
lopera1 = opera1.length;
lopera2 = opera2.length;
// Extract the string into month, date and year
if (lopera1 > 1) {
var pdate = inputTextObject.value.split('/');
} else if (lopera2 > 1) {
var pdate = inputTextObject.value.split('-');
}
var mm = parseInt(pdate[0]);
var dd = parseInt(pdate[1]);
var yy = parseInt(pdate[2]);
// Create list of days of a month [assume there is a leap year by default]
var ListofDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
if (mm == 1 || mm > 2) {
if (dd > ListofDays[mm - 1]) {
alert('Invalid date format!');
inputTextObject.focus();
ret = false;
}
}
if (mm == 2) {
var lyear = false;
if ((!(yy % 4) && yy % 100) || !(yy % 400)) {
lyear = true;
}
if ((lyear == false) && (dd >= 29)) {
alert('Invalid date format!');
inputTextObject.focus();
ret = false;
}
if ((lyear == true) && (dd > 29)) {
alert('Invalid date format!');
inputTextObject.focus();
ret = false;
}
}
} else {
alert("Invalid date format!");
inputTextObject.focus();
ret = false;
}
if (ret == false) {
inputTextObject.style.color='red';
} else {
inputTextObject.style.color='blue';
}
}
return ret;
}
</script>
</head>
<body>
Date Test (<strong>mm/dd/yyyy</strong>): <input name="date_test" type="text" onblur="validatedate(this);" />
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACYAAAAmAQMAAACS83vtAAAABlBMVEUAAAD///+l2Z/dAAAACXBIWXMAAAsTAAALEwEAmpwYAAAApElEQVQI1y3OQWpCMQBF0ZtnqF8Q286FCm7CgdgsqUv44qBuqvKXEqgLiCIokuY5qGcFJxiwcABxJoEHXhseedTkKQeony5NNdH1FLtuFEDofPc2i2sbeh0hl0jZgzoiKw1vPQhYICZKiJfQI4CFSFyyDA2FjFCCgm5fHLvIjWGs+Zo94fdvvnScOW74/6jbfdf0XClz4rnl530KLnw0XHELBvwAwg1K5dfpv8IAAAAASUVORK5CYII=" />
</body>
</html>
Now my method is ready..with the help of stackoverflow:
function validatedate(inputText)
{
var thsid=$(inputText).attr('id');
var classname=$(inputText).attr('class');
var classstr=classname.split(" ");
var ret=true;
var dateformat = /^(0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])[\/\-]\d{4}$/;
// Match the date format through regular expression
if(inputText.value.trim()!="")
{
if( inputText.value.trim().match(dateformat))
{
// document.form1.text1.focus();
//Test which seperator is used '/' or '-'
var opera1 = inputText.value.split('/');
var opera2 = inputText.value.split('-');
lopera1 = opera1.length;
lopera2 = opera2.length;
// Extract the string into month, date and year
if (lopera1>1)
{
var pdate = inputText.value.split('/');
}
else if (lopera2>1)
{
var pdate = inputText.value.split('-');
}
var mm = parseInt(pdate[0]);
var dd = parseInt(pdate[1]);
var yy = parseInt(pdate[2]);
// Create list of days of a month [assume there is no leap year by default]
var ListofDays = [31,28,31,30,31,30,31,31,30,31,30,31];
if (mm==1 || mm>2)
{
if (dd>ListofDays[mm-1])
{
alert('Invalid date format!');
$(inputText).focus();
inputText.value="";
ret=false;
return false;
}
}
if (mm==2)
{
var lyear = false;
if ( (!(yy % 4) && yy % 100) || !(yy % 400))
{
lyear = true;
}
if ((lyear==false) && (dd>=29))
{
alert('Invalid date format!');
$('#'+thsid).focus();
inputText.value="";
ret=false;
return false;
}
if ((lyear==true) && (dd>29))
{
alert('Invalid date format!');
$('#'+thsid).focus();
inputText.value="";
ret=false;
return false;
}
}
}
else
{
alert("Invalid date format!");
$('#'+thsid).focus();
inputText.value="";
ret=false;
return false;
}
}

Formatting an user input date.

Is there a better way to format a date imputed by a user. I have an input field where when clicked on a calender pops up and you can chose a date but the user also has the option to type in the date. I want the user to be able to type in 1/12 and my javascript to format it to 01/12/2012. Is there an easy way to go about this with out having to do all types of checks? If not what is the best way to go about this?
I've just gave it a try but not sure if it's the proper way but I think it's working (month/day/year).
$('input[name="txt_date"]').on('blur', function(e){
var dt=$(this).val();
if(dt!='')
{
if(dt.indexOf('/'))
{
var da=dt.split('/');
var l=da.length;
if(l <= 3)
{
var date='';
for(i=0;i<l;i++)
{
if(i==0)
{
if(da[i].match(/^\d{1}|d{2}$/) && da[i]>0 && da[i]<=12)
{
var m=da[i].length==1 ? '0'+da[i] : da[i];
date=m;
}
}
if(i==1)
{
if(da[i].match(/^\d{1}|d{2}$/) && da[i]>0 && da[i]<=31)
{
var d=da[i].length==1 ? '0'+da[i] : da[i];
date+='/'+d;
}
}
if(i==2)
{
if(da[i].match(/^\d{4}$/))
{
date+='/'+da[i];
}
else date+='/'+new Date().getFullYear();
}
}
if(l<3)
{
date+='/'+new Date().getFullYear();
}
if(date.match(/^\d{2}\/\d{2}\/\d{4}$/))
{
$(this).val(date);
}
else alert('invalid date!');
}
}
}
});
DEMO.
This library could help you: http://www.datejs.com/
dd/mm/yyyy is a valid format e.g. in Spain, UK, ...
Here's what I came up with.
var checkDate = function(dateVal, input){
if(dateVal.length == 10){
return;
}
var d = new Date();
var currentMonth = d.getMonth();
var year = d.getFullYear();
var firstIndex = dateVal.indexOf('/');
var month = parseInt(dateVal.substr(0, firstIndex));
var day = parseInt(dateVal.substr(firstIndex + 1, 2));
if(month < 10){
month = '0' + month;
}
if(day < 10){
day = '0' + day;
}
if(month > currentMonth){
year = year - 1;
}
dateVal = month + '/' + day + '/' + year;
if(isNaN(month)){
input.val('');
return;
}
input.val(dateVal);
};

Categories