【初心者向け】Javascriptで現在時刻取得、タイマー、ストップウォッチを作成する

タイマー、ストップウォッチ プログラミング

今回の記事では、Javascriptを学習し始めの初心者や未経験からエンジニア転職を目指す方に、Javascriptを使った現在時刻の取得、タイマーやストップウォッチの実装方法をご紹介します。

現在時刻取得のコード解説

超シンプルな現在時刻の取得方法を以下にご紹介します。最低限の機能のみでCSSでデザインは実装しません。

See the Pen Untitled by yoshi en (@yoshi-en) on CodePen.

HTML

    <div class="now">
      <h2>現在時刻</h2>
      <p id="js-nowTime">00:00:00</p>
    </div>

今回は、かなりシンプルな作りになっています。CSSなどデザイン設定はしていません。初期表示として、00:00:00を記述し、Javascriptで要素を取得できるように、js-nowTimeのIDを付与しています。

Javascript

// 現在時刻
const $nowTime = document.getElementById("js-nowTime");
let now; //秒
let hour; //時
let minute; //分
let second;  //秒

//現在時刻取得
function nowTimeGet() {
  now = new Date(); 
  hour = now.getHours();
  minute = now.getMinutes();
  second = now.getSeconds();
  //10を超えたら0に戻す
  if (hour < 10) {
    hour = "0" + hour;
  }
  if (minute < 10) {
    minute = "0" + minute;
  }
  if (second < 10) {
    second = "0" + second;
  }
  return hour, minute, second;
}

//1秒ごとに、nowTimeGet関数を実行し、HTMLの文字を書き換える
window.addEventListener("load", () => {
  setInterval(function () {
    nowTimeGet();
    $nowTime.innerHTML = `${hour}:${minute}:${second}`;
  }, 1000);
});
  • 2~5行目で必要な定数を定義します。
  • 9行目~現在時刻取得の関数を設定します。10行目のnew Date()は、現在の日付や時刻を取得します。取得した時刻から、getHours、getMinutes、getSecondsで時・分・秒を取得して、if文の判定条件を付けた後、戻り値として返却します。
  • 28行目~windowがloadしたら処理が実行されるイベントリスナーを設定します。setInterval()で、1秒ごとにnowTimeGet関数を呼び出し、HTMLのテキストを書き換えます

setInterval(function関数,ミリ秒):ミリ秒ごとにfunction関数を実行する

ストップウォッチのコード解説

先ほど、ご紹介した現在時刻取得を活用して実装します。スタートやストップ、リセットなどのイベントが複数あるので、少し複雑なJavascriptの構文になります

See the Pen Untitled by yoshi en (@yoshi-en) on CodePen.

HTML

<div class="stopwatch">
  <h2>ストップウォッチ</h2>
  <p id="js-stopwatch">00:00:00</p>
  <input id="js-stopwatchStart" type="button" value="開始" />
  <input id="js-stopwatchStop" type="button" value="停止" disabled />
  <input id="js-stopwatchResset" type="button" value="リセット" disabled />
</div>

今回もHTMLは、かなりシンプルな作りになっています。CSSなどデザイン設定はしていません。初期表示として、00:00:00を記述し、スタート・ストップ・リセットボタンを配置し、Javascriptで要素を取得できるように、各要素にIDを付与しています

Javascript

// ■ストップウォッチ
const $watch = document.getElementById("js-stopwatch");
const $start = document.getElementById("js-stopwatchStart");
const $stop = document.getElementById("js-stopwatchStop");
const $resset = document.getElementById("js-stopwatchResset");

// 開始時間
let startTime;
// 停止時間
let stopTime = 0;
// タイムアウトID
let timeoutID;

// 時間を表示する関数
function displayTime() {
  const currentTime = new Date(Date.now() - startTime + stopTime);
  const h = String(currentTime.getHours() - 9).padStart(2, "0");
  const m = String(currentTime.getMinutes()).padStart(2, "0");
  const s = String(currentTime.getSeconds()).padStart(2, "0");

  $watch.textContent = `${h}:${m}:${s}`;
  timeoutID = setTimeout(displayTime, 1000);
}

// スタートボタンがクリックされたら時間を進める
$start.addEventListener("click", () => {
  $start.disabled = true;
  $stop.disabled = false;
  $resset.disabled = true;
  startTime = Date.now();
  displayTime();
});

// ストップボタンがクリックされたら時間を止める
$stop.addEventListener("click", function () {
  $start.disabled = false;
  $stop.disabled = true;
  $resset.disabled = false;
  clearTimeout(timeoutID);
  stopTime += Date.now() - startTime;
});

// リセットボタンがクリックされたら時間を0に戻す
$resset.addEventListener("click", function () {
  $start.disabled = false;
  $stop.disabled = true;
  $resset.disabled = true;
  $watch.textContent = "00:00:00";
  stopTime = 0;
});
  • 2~5行目でHTMLのDOMを取得します。
  • 8~12行目で、開始時刻、停止時間、タイムアウトID(setIntevalで使う)を変数定義します。
  • 15行目~HTML要素の時間を書き換えます。16行目では、Date.now()の現在時刻から、startTimeの開始時刻の差分を求めます。(stopTimeの停止時間があればその分を考慮する)あとは、時・分・秒に変換をして、setTimeoutで、1秒ごとにdisplayTimeを繰り返し実行します。
  • 26行目~スタートボタンがクリックされた際にイベントが発火し、ボタンをそれぞれ活性・日活性に設定します。startTimeに開始時刻を設定し、displayTime関数を呼び出します。
  • 35行目~ストップボタンがクリックされた際にイベント発火し、displayTime関数setTimeoutをクリアしますstopTimeに停止時間を格納します。
  • 44行目~リセットボタンがクリックされた際にイベントが発火し、HTMLを00:00:00に戻します。停止時間も0にリセットします。
  • Date. now():UTC(協定世界時)での1970年1月1日0時0分0秒から現在までの経過時間をミリ秒単位で返すメソッドです
  • String.padStart(2, “0”):Stringを第一引数の文字数まで、第二引数の文字を先頭に追加します

タイマーのコード解説

See the Pen Untitled by Yoshiki (@Yoshiki-0328) on CodePen.

HTML

<div class="timer">
  <h2>タイマー</h2>
  <div class="timer-input">
    <input type="text" value="0" />秒
  </div>
  <p id="js-timerTime">00:00:00</p>
  <input id="js-timerStart" type="button" value="開始" />
  <input id="js-timerStop" type="button" value="停止" disabled />
  <input id="js-timerResset" type="button" value="リセット" disabled />
</div>

今回もHTMLは、かなりシンプルな作りになっています。CSSなどデザイン設定はしていません。初期表示として、00:00:00を記述し、設定時間インプットボックス、スタート・ストップ・リセットボタンを配置し、Javascriptで要素を取得できるように、各要素にIDを付与しています

Javascript

// ■カウントダウンタイマー
const $timer=document.getElementById('js-timerTime');
const $tStart = document.getElementById('js-timerStart');
const $tStop =document.getElementById('js-timerStop');
const $tResset =document.getElementById('js-timerResset');

// 入力値を取得
const $input = document.querySelector('.timer-input input');

// ターゲット時間
let tTarget; //残り時間
let tStartTime; //開始時刻
let tStopTime=0; //停止時間
let tCountId ; //インターバル格納
let setTime; //カウントダウン設定時間

// ターゲット時間をセットし描画
function displayCount(){
  tTarget = new Date(tStartTime+(1000*setTime)-Date.now()-tStopTime);
  let ch = String(tTarget.getHours()-9).padStart(2,'0');
  let cm = String(tTarget.getMinutes()).padStart(2,'0');
  let cs = String(tTarget.getSeconds()).padStart(2,'0');
  if(cs==0){
    tResset();
    alert('終了です');
  }else{
    $timer.innerHTML=(`${ch}:${cm}:${cs}`);
    tCountId = setTimeout(displayCount,500);
  }
}

// スタートボタンを押したとき
$tStart.addEventListener('click',()=>{
  $tStart.disabled = true;
  $tStop.disabled = false;
  $tResset.disabled = true;
  setTime =$input.value;
  tStartTime = Date.now();
  displayCount();
});

// ストップボタンを押したとき
$tStop.addEventListener('click',()=>{
  $tStart.disabled = false;
  $tStop.disabled = true;
  $tResset.disabled = false;
  clearTimeout(tCountId);
  tStopTime +=Date.now()-tStartTime;
});

// リセットボタンが押されたとき
$tResset.addEventListener("click", function () {
  tResset();
});

function tResset(){
  $tStart.disabled = false;
  $tStop.disabled = true;
  $tResset.disabled = true;
  $timer.textContent = "00:00:00";
  tStopTime = 0;  
}

かなり長い記述になってしまいましたが、基本的には先ほどご紹介したストップウォッチの時と同様です。

  • 2~15行目で、HTMLのDOM要素を取得し、変数を定義します。
  • 18行目~で、displayCount関数の19行目で、tstatTime(開始時刻)とsetTime設定時刻)を足したものとDate. now()(現在時刻)の差を求めます。(tStopTime(停止時間)があればそれも考慮します。以降は、ストップウォッチの時と同様で、1秒ごとに残り時間を書き換えます。残り時間が0秒以下になったら、26行目の箇所でアラートを表示します
  • 35行目~で、スタートボタンのイベントを設定し、setTime(設定時間)に、HTMLのインプットボックスに入力された数字を格納します。
  • 45行目~で、ストップボタンがクリックされた時、setTimeoutを停止し、停止時間を格納します。
  • 54行目~で、リセットボタンが押される、またはカウントダウンが0以下になった際にイベントが実行され、初期状態00:00:00にリセットされます。

まとめ

今回の記事では、Javascriptを学習し始めの初心者や未経験からエンジニア転職を目指す方に、Javascriptを使った現在時刻の取得、タイマーやストップウォッチの実装方法をご紹介します。

途中、記述が長くなってしまったところもありますが、記述している内容はシンプルなものばかりですので、コメント等入れ自分で整理をしながら、ぜひ実装してみてください。

タイトルとURLをコピーしました