3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP Carbonを使って日付差分から期間をxx日xx時間xx分の自然な日本語フォーマットに変換する

Last updated at Posted at 2018-12-10

100分だったら1時間20分
100時間だったら4日4時間
みたいな変換をします。
私のググり方が良くないのか、全然見つからなかったので備忘録。
秒には対応しておりません。

/**
 * ex. 2018/12/05 00:00:00, 2018/12/10 00:00:00 => 5日間
 * ex. 2018/12/07 00:00:00, 2018/12/10 10:50:00 => 3日10時間50分
 * ex. 2018/12/10 00:00:00, 2018/12/10 20:08:00 => 20時間8分
 * ex. 2018/12/10 00:00:00, 2018/12/10 00:50:00 => 50分間
 */
    /**
     * 日付差分を算出し、xx日間xx時間xx分のフォーマットに変換する
     * @param string $start_datetime yyyy-mm-dd H:i:s Carbon::parse()で処理可能な形式ならなんでも
     * @param string $end_datetime
     * @return string|null データ不整合の場合はnullを返す
     */
    public function diffFormatCarbonDatetime($start_datetime,$end_datetime){
        if (empty($start_datetime) || empty($end_datetime)) {
            return null;
        }
        $start_carbon = Carbon::parse($start_datetime);
        $end_carbon   = Carbon::parse($end_datetime);
        if ($start_carbon->gt($end_carbon)) {
            return null;
        }
        // 差分計算
        $diff_days    = $start_carbon->diffInDays($end_carbon);
        $diff_hours   = $start_carbon->diffInHours($end_carbon);
        $diff_minutes = $start_carbon->diffInMinutes($end_carbon);
        // 日付差分を自然な日本語にする(0の日時分は非表示とする)
        $result_string = '';
        $string_kan_flg = false; // 最後に"間"をつけるか否か
        if ($diff_days > 0) {
            $result_string .= $diff_days.'日';
        }
        if ($diff_hours > 0) {
            $diff_hours = ($diff_hours < 24)? $diff_hours : $diff_hours%24; // 100hなら4日間分の96hを切り落とし4hとする
            if ($diff_hours > 0) {
                $string_kan_flg = true;
                $result_string .= $diff_hours.'時間';
            }
        }
        $diff_minutes = ($diff_minutes < 60)? $diff_minutes : $diff_minutes%60; // 100分なら1時間分の60を切り落とし40分とする
        if ($diff_minutes > 0 || ($diff_days === 0 && $diff_hours === 0)) { // 0分のときは、0日0時間の場合のみ0分を表示する
            $result_string .= $diff_minutes.'分';
        }
        // どこにも"間"が無いなら最後につける
        $result_string = ($string_kan_flg)? $result_string : $result_string.'間';
        return $result_string;
    }
3
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?