Search code examples
javascriptmomentjscountdown

returning a negative countdown using moment.js


I created a countdown, but it's returning a negative output instead of a positive one. I have researched reasons why this happens, but no luck. does anyone know why a countdown can return negative? and where in my code did I turned it negative? thanks in advance!

var now = moment();

var targetDay = now.format("2020-11-03", "dddd, MMMM Do YYYY");

var countDown= Math.floor(moment().diff(targetDay, 'seconds'));

var Days, Minutes,Hours,Seconds;

  setInterval(function(){
   // Updating Days 
   Days =pad(Math.floor(countDown / 86400),2);
    //updating Hours
    Hours = pad(Math.floor((countDown - (Days * 86400)) / 3600),2);
  // Updating Minutes
    Minutes =pad(Math.floor((countDown - (Days * 86400) - (Hours * 3600)) / 60),2);
// Updating Seconds
   Seconds = pad(Math.floor((countDown - (Days * 86400) - (Hours* 3600) - (Minutes * 60))), 2);

  // Updation our HTML view
 document.getElementById("days").innerHTML=Days + ' Days';
 document.getElementById("hours").innerHTML=Hours + ' Hours';
 document.getElementById("minutes").innerHTML=Minutes+ ' Minutes';
 document.getElementById("seconds").innerHTML=Seconds + ' Seconds';

     // Decrement 
 countDown--;


if(countDown === 0){
    countDown= Math.floor(moment().diff(targetDay, 'seconds'));
}

 },1000);
  // Function for padding the seconds i.e limit it only to 2 digits
    function pad(num, size) {
        var s = num + "";
        while (s.length < size) s = "0" + s;
        return s;
    }

Solution

  • Quote from momentjs docs:

    By default, moment#diff will return a number rounded towards zero (down for positive, up for negative) If the moment is earlier than the moment you are passing to moment.fn.diff, the return value will be negative.

    So, to fix this issue you should use the following code

    var now = moment();
    var targetDay = moment('2020-11-23', 'YYYY-MM-DD');
    var countDown= Math.floor(targetDay.diff(now, 'seconds'));
    

    Value will be positive because targetDay moment is later that the moment you're passing to moment.diff