PHP
0
どのような問題がありますか?

投稿日

PHPで時刻(00:00:00)を秒に変換する方法

##はじめに

仕事柄、頻繁に時刻であったり記録(●●分●●秒など)を扱う機会が多いです。

PHPで時間(時刻)を計算するには、UNIXタイムスタンプの値を操作することで求めることができますが、「時刻じゃなくて記録(36時間24分56秒などもあり)なんだよな~」、「一度秒にしてから四則計算してこんなことをしたいんだよな~」と思うことが多々ありました。

大したことは全くしていませんが、誰かの参考になれば幸いです。

##時間(00:00:00)から秒へ変換

php
// 時間から秒へ変換(00:00:00→00000秒)
function hour_to_sec(string $str): int
{
    $t = explode(":", $str); //配列($t[0](時)、$t[1](分)、$t[2](秒))にする
    $h = (int)$t[0];
    if (isset($t[1])) { //分の部分に値が入っているか確認
        $m = (int)$t[1];
    } else {
        $m = 0;
    }
    if (isset($t[2])) { //秒の部分に値が入っているか確認
        $s = (int)$t[2];
    } else {
        $s = 0;
    }
    return ($h * 60 * 60) + ($m * 60) + $s;
}

秒に変換してしまえば後は煮るなり焼くなりしてお好きなように :)

念のため、再度時間表記(0:00:00)に戻すやり方も記載させていただきます。

##秒から時間(0:00:00)へ変換

php

// 秒⇒時間:分:秒へ変換(0:00:00表記)
function sec_to_hour(int $sec): int
{
    $hours = floor($sec / 3600); //時間
    $minutes = floor(($sec / 60) % 60); //分
    $seconds = floor($sec % 60); //秒
    $hms = sprintf("%2d:%02d:%02d", $hours, $minutes, $seconds);
    return $hms;
}

後半に出てきたsprintf
指定したフォーマット(形式)で文字列を生成という感じですかね。
(たまにExcelの表記とかで見ますね)

(型指定子と呼ばれる部分)
「%」:第二引数から順番に入れていく部分
「2」:桁数(0ありなら03や05などで表記してくれる、無い場合は空白で埋めてくれる)
「d」:10進数の整数を指定

この部分を「%2d時%02d分%02d秒」とすれば「1時間23分45秒」などの結果を得ることもできます。

##備考
ミリ秒が発生するような場合は上記では正確な結果が得られません。
stropsで無理やり無くしても...
ミリ秒ぐらい別に誰も困らないと思っている自分

また時間を見つけて記載させていただきます...

##最後に
まだまだコードの書き方含めまして拙い部分が多々あるかと思います。

『もっとこんな方法もあるよ!』

『このやりかたの方が処理が速い』

などありましたら是非コメント欄にて教えていただければ幸いです。

##参考にさせていただいたサイト

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
ユーザー登録ログイン

コメント

引数のフォーマットが時間:分:秒という文字列固定であるなら、こんな感じでいいかな。

function time2seconds($str_time) {
  $m = explode(':', $str_time);
  return ($m[0] * 60 + $m[1]) * 60 + $m[2];
}

echo time2seconds('12:34:56');  // 45296
echo time2seconds('65:43:21');  // 236601
echo time2seconds('123:00:00');  // 442800

秒からの変換は

function seconds2time($seconds) {
  return (int)($seconds / 3600). gmdate(':i:s', $seconds);
}

echo seconds2time(236601);  // 65:43:21
0

投稿内容が https://qiita.com/Shouin/items/b4d8d74f2ccba333365b と全く同じですが、同じ方ですか?

それとも…

0
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
データに関する記事を書こう!
~
新人プログラマ応援 - みんなで新人を育てよう!
~
0
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー