Search code examples
javascripthtmlcsscountdowntimer

How to format script for time in Countdown Timer - HTML, CSS, JavaScript


Below I have code for a countdown timer, but I'm looking to simplify the way to enter the date and am having trouble doing so.

I want to change my date format of:

var target_date = new Date().getTime() + (1000*3600*48); // set the countdown date

With this more easier/specific format of:

// Set the date we're counting down to
var countDownDate = new Date("Sep 5, 2018 15:37:25").getTime();

Below is the entire code. BONUS if a title can appear right above the timer!

var target_date = new Date().getTime() + (1000 * 3600 * 48); // set the countdown date
var days, hours, minutes, seconds; // variables for time units

var countdown = document.getElementById("tiles"); // get tag element

getCountdown();

setInterval(function() {
  getCountdown();
}, 1000);

function getCountdown() {

  // find the amount of "seconds" between now and target
  var current_date = new Date().getTime();
  var seconds_left = (target_date - current_date) / 1000;

  days = pad(parseInt(seconds_left / 86400));
  seconds_left = seconds_left % 86400;

  hours = pad(parseInt(seconds_left / 3600));
  seconds_left = seconds_left % 3600;

  minutes = pad(parseInt(seconds_left / 60));
  seconds = pad(parseInt(seconds_left % 60));

  // format countdown string + set tag value
  countdown.innerHTML = "<span>" + days + "</span><span>" + hours + "</span><span>" + minutes + "</span><span>" + seconds + "</span>";
}

function pad(n) {
  return (n < 10 ? '0' : '') + n;
}
body {
  font: normal 13px/20px Arial, Helvetica, sans-serif;
  word-wrap: break-word;
  color: #eee;
  background: #353535;
}

#countdown {
  width: 465px;
  height: 112px;
  text-align: center;
  background: #222;
  background-image: -webkit-linear-gradient(top, #222, #333, #333, #222);
  background-image: -moz-linear-gradient(top, #222, #333, #333, #222);
  background-image: -ms-linear-gradient(top, #222, #333, #333, #222);
  background-image: -o-linear-gradient(top, #222, #333, #333, #222);
  border: 1px solid #111;
  border-radius: 5px;
  box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.6);
  margin: auto;
  padding: 24px 0;
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
}

#countdown:before {
  content: "";
  width: 8px;
  height: 65px;
  background: #444;
  background-image: -webkit-linear-gradient(top, #555, #444, #444, #555);
  background-image: -moz-linear-gradient(top, #555, #444, #444, #555);
  background-image: -ms-linear-gradient(top, #555, #444, #444, #555);
  background-image: -o-linear-gradient(top, #555, #444, #444, #555);
  border: 1px solid #111;
  border-top-left-radius: 6px;
  border-bottom-left-radius: 6px;
  display: block;
  position: absolute;
  top: 48px;
  left: -10px;
}

#countdown:after {
  content: "";
  width: 8px;
  height: 65px;
  background: #444;
  background-image: -webkit-linear-gradient(top, #555, #444, #444, #555);
  background-image: -moz-linear-gradient(top, #555, #444, #444, #555);
  background-image: -ms-linear-gradient(top, #555, #444, #444, #555);
  background-image: -o-linear-gradient(top, #555, #444, #444, #555);
  border: 1px solid #111;
  border-top-right-radius: 6px;
  border-bottom-right-radius: 6px;
  display: block;
  position: absolute;
  top: 48px;
  right: -10px;
}

#countdown #tiles {
  position: relative;
  z-index: 1;
}

#countdown #tiles>span {
  width: 92px;
  max-width: 92px;
  font: bold 48px 'Droid Sans', Arial, sans-serif;
  text-align: center;
  color: #111;
  background-color: #ddd;
  background-image: -webkit-linear-gradient(top, #bbb, #eee);
  background-image: -moz-linear-gradient(top, #bbb, #eee);
  background-image: -ms-linear-gradient(top, #bbb, #eee);
  background-image: -o-linear-gradient(top, #bbb, #eee);
  border-top: 1px solid #fff;
  border-radius: 3px;
  box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.7);
  margin: 0 7px;
  padding: 18px 0;
  display: inline-block;
  position: relative;
}

#countdown #tiles>span:before {
  content: "";
  width: 100%;
  height: 13px;
  background: #111;
  display: block;
  padding: 0 3px;
  position: absolute;
  top: 41%;
  left: -3px;
  z-index: -1;
}

#countdown #tiles>span:after {
  content: "";
  width: 100%;
  height: 1px;
  background: #eee;
  border-top: 1px solid #333;
  display: block;
  position: absolute;
  top: 48%;
  left: 0;
}

#countdown .labels {
  width: 100%;
  height: 25px;
  text-align: center;
  position: absolute;
  bottom: 8px;
}

#countdown .labels li {
  width: 102px;
  font: bold 15px 'Droid Sans', Arial, sans-serif;
  color: #f47321;
  text-shadow: 1px 1px 0px #000;
  text-align: center;
  text-transform: uppercase;
  display: inline-block;
}
<div id="countdown">
  <div id='tiles'></div>
  <div class="labels">
    <li>Days</li>
    <li>Hours</li>
    <li>Mins</li>
    <li>Secs</li>
  </div>
</div>


Solution

  • There are several ways to create date object in javascript

    new Date();
    new Date(value);
    new Date(dateString);
    new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]);
    

    I will focus on new Date(dateString); way you want to use:

    dateString -String value representing a date. The string should be in a format recognized by the Date.parse() method (IETF-compliant RFC 2822 timestamps and also a version of ISO8601).

    In your code your described format will also work ==>

    var countDownDate = new Date("Sep 5, 2018 15:37:25").getTime();
    

    Please check the below code snippet

    var countDownDate = new Date().getTime() + (1000*3600*48);
    //var countDownDate = new Date("July 8, 2018 15:37:25").getTime(); // set the countdown date
    console.log(countDownDate)
    var days, hours, minutes, seconds; // variables for time units
    
    var countdown = document.getElementById("tiles"); // get tag element
    
    getCountdown();
    
    setInterval(function() {
      getCountdown();
    }, 1000);
    
    function getCountdown() {
    
      // find the amount of "seconds" between now and target
      var current_date = new Date().getTime();
      var seconds_left = (countDownDate - current_date) / 1000;
    
      days = pad(parseInt(seconds_left / 86400));
      seconds_left = seconds_left % 86400;
    
      hours = pad(parseInt(seconds_left / 3600));
      seconds_left = seconds_left % 3600;
    
      minutes = pad(parseInt(seconds_left / 60));
      seconds = pad(parseInt(seconds_left % 60));
    
      // format countdown string + set tag value
      countdown.innerHTML = "<span>" + days + "</span><span>" + hours + "</span><span>" + minutes + "</span><span>" + seconds + "</span>";
    }
    
    function pad(n) {
      return (n < 10 ? '0' : '') + n;
    }
    body {
      font: normal 13px/20px Arial, Helvetica, sans-serif;
      word-wrap: break-word;
      color: #eee;
      background: #353535;
    }
    
    #countdown {
      width: 465px;
      height: 112px;
      text-align: center;
      background: #222;
      background-image: -webkit-linear-gradient(top, #222, #333, #333, #222);
      background-image: -moz-linear-gradient(top, #222, #333, #333, #222);
      background-image: -ms-linear-gradient(top, #222, #333, #333, #222);
      background-image: -o-linear-gradient(top, #222, #333, #333, #222);
      border: 1px solid #111;
      border-radius: 5px;
      box-shadow: 0px 0px 8px rgba(0, 0, 0, 0.6);
      margin: auto;
      padding: 24px 0;
      position: absolute;
      top: 0;
      bottom: 0;
      left: 0;
      right: 0;
    }
    
    #countdown:before {
      content: "";
      width: 8px;
      height: 65px;
      background: #444;
      background-image: -webkit-linear-gradient(top, #555, #444, #444, #555);
      background-image: -moz-linear-gradient(top, #555, #444, #444, #555);
      background-image: -ms-linear-gradient(top, #555, #444, #444, #555);
      background-image: -o-linear-gradient(top, #555, #444, #444, #555);
      border: 1px solid #111;
      border-top-left-radius: 6px;
      border-bottom-left-radius: 6px;
      display: block;
      position: absolute;
      top: 48px;
      left: -10px;
    }
    
    #countdown:after {
      content: "";
      width: 8px;
      height: 65px;
      background: #444;
      background-image: -webkit-linear-gradient(top, #555, #444, #444, #555);
      background-image: -moz-linear-gradient(top, #555, #444, #444, #555);
      background-image: -ms-linear-gradient(top, #555, #444, #444, #555);
      background-image: -o-linear-gradient(top, #555, #444, #444, #555);
      border: 1px solid #111;
      border-top-right-radius: 6px;
      border-bottom-right-radius: 6px;
      display: block;
      position: absolute;
      top: 48px;
      right: -10px;
    }
    
    #countdown #tiles {
      position: relative;
      z-index: 1;
    }
    
    #countdown #tiles>span {
      width: 92px;
      max-width: 92px;
      font: bold 48px 'Droid Sans', Arial, sans-serif;
      text-align: center;
      color: #111;
      background-color: #ddd;
      background-image: -webkit-linear-gradient(top, #bbb, #eee);
      background-image: -moz-linear-gradient(top, #bbb, #eee);
      background-image: -ms-linear-gradient(top, #bbb, #eee);
      background-image: -o-linear-gradient(top, #bbb, #eee);
      border-top: 1px solid #fff;
      border-radius: 3px;
      box-shadow: 0px 0px 12px rgba(0, 0, 0, 0.7);
      margin: 0 7px;
      padding: 18px 0;
      display: inline-block;
      position: relative;
    }
    
    #countdown #tiles>span:before {
      content: "";
      width: 100%;
      height: 13px;
      background: #111;
      display: block;
      padding: 0 3px;
      position: absolute;
      top: 41%;
      left: -3px;
      z-index: -1;
    }
    
    #countdown #tiles>span:after {
      content: "";
      width: 100%;
      height: 1px;
      background: #eee;
      border-top: 1px solid #333;
      display: block;
      position: absolute;
      top: 48%;
      left: 0;
    }
    
    #countdown .labels {
      width: 100%;
      height: 25px;
      text-align: center;
      position: absolute;
      bottom: 8px;
    }
    
    #countdown .labels li {
      width: 102px;
      font: bold 15px 'Droid Sans', Arial, sans-serif;
      color: #f47321;
      text-shadow: 1px 1px 0px #000;
      text-align: center;
      text-transform: uppercase;
      display: inline-block;
    }
    <div id="countdown">
      <div id='tiles'></div>
      <div class="labels">
        <li>Days</li>
        <li>Hours</li>
        <li>Mins</li>
        <li>Secs</li>
      </div>
    </div>