SeinopSys
SeinopSys

Reputation: 8937

Logic to use to find out if the entered date is today or later

I have function that loops every 500ms, and collects date information:

var mlptoday = {};

var timer = setTimeout(today,500);

function today(){
    var d = new Date()
    mlptoday.date = checkTime(d.getDate()); //output: "27"
    mlptoday.year = d.getFullYear(); //output: "2013"
    mlptoday.month = checkTime(d.getMonth()+1); //output: "01"
}

function checkTime(i) { if (i<10){i="0" + i} return i }

In a different function, I would like to check if the date the user gives as input is either the same day, or after the given day.

An example input may be: 2013.01.27.

I use this snippet of code to achieve what I want:

var remTime = "2013.01.27"; //user input
var remTimeArray = remTime.split('.') //output: ["2013","01","27"]
if (
    !(remTimeArray[0] >= parent.mlptoday.year &&
    remTimeArray[1] >= parent.mlptoday.month) ||
    !((remTimeArray[1] == parent.mlptoday.month) ? Boolean(remTimeArray[2]*1 >= parent.mlptoday.date) : true)
){
    //the input date is in the past
}

As you could probably guess, this does not work. The conditional statement seems to fail me, because if I invert Boolean(...) with an !(...), it will never fire the error, otherwise it always will.

Here's a snippet, where it works at it should:

var mlptoday = {};

var timer = setTimeout(today,500);

function today(){
    var d = new Date();
    mlptoday.year = d.getFullYear(); //output: "2013"
    mlptoday.month = checkTime(d.getMonth()+1); //output: "01"
    mlptoday.date = checkTime(d.getDate()); //output: "27"
    
    $('#values').html(JSON.stringify(mlptoday));
}


function checkTime(i) { if (i<10){i="0" + i} return i }

$(document).ready(function(){
    $('form').submit(function(e){
        e.preventDefault();
        var remTime = $('input').val(); //user input
        var remTimeArray = remTime.split('.') //output: ["2013","01","27"]
        if (
            !(remTimeArray[0] >= mlptoday.year &&
            remTimeArray[1] >= mlptoday.month) ||
            !((remTimeArray[1] == mlptoday.month) ? Boolean(remTimeArray[2]*1 >= mlptoday.date) : true)
        ){
            $('#past').fadeIn('fast').delay(500).fadeOut('fast');
        }
    })
})
#past { display:none; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<form>
    <input type="text" id="input" required autocomplete="off" placeholder="yyyy.mm.dd" pattern="^(19|20)\d\d[.](0[1-9]|1[012])[.](0[1-9]|[12][0-9]|3[01])$" required="" />
    <button>Check</button>
</form>
<pre id="values"></pre>
<span id="past">the input date is in the past</span>

I need a better way to do this, and I don't want to use any date picker plugins.

Upvotes: 0

Views: 156

Answers (1)

Boyko Karadzhov
Boyko Karadzhov

Reputation: 586

I would compare the dates as integers to avoid complex logic.

var todayConcat = "" + parent.mlptoday.year + parent.mlptoday.month + parent.mlptoday.date;
var remTimeConcat = remTime.replace(/\./g, "");
if (remTimeConcat < todayConcat) {
  //the input time is in the past
}

Just make sure the dates and months always have the leading zero.

Upvotes: 1

Related Questions