JavaScript 秒を時・分・秒や hh:mm:ss に変換

作成日:2023年5月8日

与えられた秒数を時間・分・秒や日・時間・分・秒、hh:mm:ss などに変換する方法です。

例えば100000秒を「27時間46分40秒」や「1日3時間46分40秒」、「27:46:40」に変換します。

変換するには以下の値を使用します。

単位 式(算出)
1分(min) 60 1 * 60
1時間(hour) 3600 60 * 60
1日(day) 86400 60 * 60 * 24

100000秒を日・時間・分・秒に変換するには、以下のように計算することができます。

// 秒数を一日(86400)で割って切り捨て
const day = Math.floor(100000 / 86400);
console.log(`${day}日`);  // 1日

// 秒数を一日(86400)で割った余りを時間(3600)で割って切り捨て
const hour = Math.floor(100000 % 86400 / 3600);
console.log(`${hour}時間`);  // 3時間

// 秒数を時間(3600)で割った余りを分(60)で割って切り捨て
const min = Math.floor(100000 % 3600 / 60);
console.log(`${min}分`);  // 46分

// 秒数を分(60)で割った余り
const sec = 100000 % 60;
console.log(`${sec}秒`);  // 40秒

`${day}日`はバッククォート(`)で文字列を囲むテンプレートリテラルです。`${変数名}` のように記述すると ${ } の中の変数が展開されます。

const day = Math.floor(100000 / 86400);
console.log(`${day}日`);  // 1日

//以下と同じこと
console.log(day + '日');  // 1日

日時分秒に変換

以下は引数に与えられた秒数を日時分秒に変換する関数の例です。

function secToDayTime(seconds) {
  const day = Math.floor(seconds / 86400);
  const hour = Math.floor(seconds % 86400 / 3600);
  const min = Math.floor(seconds % 3600 / 60);
  const sec = seconds % 60;
  let time = '';
  // day が 0 の場合は「日」は出力しない(hour や min も同様)
  if(day !== 0) {
    time = `${day}日${hour}時間${min}分${sec}秒`;
  }else if(hour !==0 ) {
    time = `${hour}時間${min}分${sec}秒`;
  }else if(min !==0) {
    time = `${min}分${sec}秒`;
  }else {
    time = `${sec}秒`;
  }
  return time;
}

console.log(secToDayTime(100000)); // 1日3時間46分40秒
console.log(secToDayTime(10000));  // 2時間46分40秒
console.log(secToDayTime(1000));   // 16分40秒
console.log(secToDayTime(100));    // 1分40秒
console.log(secToDayTime(10));     // 10秒
console.log(secToDayTime(0));      // 0秒

時分秒に変換

以下は引数に与えられた秒数を時分秒に変換する関数の例です。

function secToTime(seconds) {
  const hour = Math.floor(seconds / 3600);
  const min = Math.floor(seconds % 3600 / 60);
  const sec = seconds % 60;
  let time = '';
  if(hour !==0 ) {
    time = `${hour}時間${min}分${sec}秒`;
  }else if(min !==0) {
    time = `${min}分${sec}秒`;
  }else {
    time = `${sec}秒`;
  }
  return time;
}
console.log(secToTime(100000));  // 27時間46分40秒
console.log(secToTime(10000));   // 2時間46分40秒
console.log(secToTime(1000));    // 16分40秒
console.log(secToTime(100));     // 1分40秒
console.log(secToTime(10));      // 10秒
console.log(secToTime(0));       // 0秒

桁あわせ(ゼロパディング)

桁数を合わせるために、時分秒の各値が1桁の場合は先頭に 0 を付けて2桁で表示する例です。

文字列のメソッド slice() の引数に -2 を指定して、文字列の最後から2文字を取り出します。

例えば、'001'.slice(-2) とすると 最後の2文字 01 を取得できます。

console.log('001'.slice(-2));  // 01

console.log('0012'.slice(-2));  // 12

console.log('00'.slice(-2));  // 00

以下は時分秒に変換する関数を、1桁の場合は先頭に 0 を付けて表示するように書き換えたものです。

hour は3桁以上になる場合は、slice(-2) を適用すると2桁しか取得できないので3桁以上かどうかで分岐しています。

function secToTimeZeroPadding(seconds) {
  const hour = Math.floor(seconds / 3600);
  const min = Math.floor(seconds % 3600 / 60);
  const sec = seconds % 60;
  let hh;
  if (hour < 100) {
    hh = (`00${hour}`).slice(-2);
  } else {
    // hour が3桁以上の場合は左0埋めをしない
    hh = hour;
  }
  const mm = (`00${min}`).slice(-2);
  const ss = (`00${sec}`).slice(-2);

  let time = '';

  if (hour !== 0) {
    time = `${hh}時間${mm}分${ss}秒`;
  } else if (min !== 0) {
    time = `${mm}分${ss}秒`;
  } else {
    time = `${ss}秒`;
  }
  return time;
}
console.log(secToTimeZeroPadding(1000000)); // 277時間46分40秒
console.log(secToTimeZeroPadding(100000));  // 27時間46分40秒
console.log(secToTimeZeroPadding(10020));   // 02時間46分00秒
console.log(secToTimeZeroPadding(1000));    // 16分40秒
console.log(secToTimeZeroPadding(100));     // 01分40秒
console.log(secToTimeZeroPadding(5));       // 05秒
console.log(secToTimeZeroPadding(0));       // 00秒

hh:mm:ss に変換

以下は引数に与えられた秒数を hh:mm:ss 形式に変換する関数の例です。

時分秒の各値が1桁の場合は、左に0を付けて2桁で表示します。

function secToHMS(seconds) {
  const hour = Math.floor(seconds / 3600);
  const min = Math.floor(seconds % 3600 / 60);
  const sec = seconds % 60;
  let hh;
  // hour が3桁以上の場合は左0埋めをしない
  if(hour < 100) {
    hh = (`00${hour}`).slice(-2);
  }else{
    hh = hour;
  }
  const mm = (`00${min}`).slice(-2);
  const ss = (`00${sec}`).slice(-2);
  let time = '';
  if(hour !== 0 ) {
    time = `${hh}:${mm}:${ss}`;
  }else{
    time = `${mm}:${ss}`;
  }
  return time;
}
console.log(secToHMS(100000));  // 27:46:40
console.log(secToHMS(10000));   // 02:46:40
console.log(secToHMS(1000));    // 16:40
console.log(secToHMS(100));     // 01:40
console.log(secToHMS(10));      // 00:10
console.log(secToHMS(0));       // 00:00

ビット否定演算子2つで小数の切り捨て

ビット否定演算子 ~(Bitwise NOT Operator)を2つ ~~ 使用すると、以下のように小数の切り捨てを行うことができます。

console.log(~~ 1.23); // 1

console.log(~~ -9.87); // -9

前述の hh:mm:ss 形式に変換する関数の Math.floo() の部分は ~~ を使って以下のように記述することもできます(但し、他人が見て分かりにくいと思いますが)。

function secToHMS(seconds) {
  // Math.floo() の代わりに ~~ で切り捨て
  const hour = ~~(seconds / 3600);
  const min = ~~(seconds % 3600 / 60);
  const sec = seconds % 60;
  let hh;
  if(hour < 100) {
    hh = (`00${hour}`).slice(-2);
  }else{
    hh = hour;
  }
  const mm = (`00${min}`).slice(-2);
  const ss = (`00${sec}`).slice(-2);
  let time = '';
  if(hour !== 0 ) {
    time = `${hh}:${mm}:${ss}`;
  }else{
    time = `${mm}:${ss}`;
  }
  return time;
}