今回の記事では、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を使った現在時刻の取得、タイマーやストップウォッチの実装方法をご紹介します。
途中、記述が長くなってしまったところもありますが、記述している内容はシンプルなものばかりですので、コメント等入れ自分で整理をしながら、ぜひ実装してみてください。