[PHP]date_interval_format()関数完全解説!期間フォーマットをマスターしよう

PHP

こんにちは!今回は、PHPで期間の表示形式をカスタマイズできるdate_interval_format()関数について詳しく解説していきます。

📅 date_interval_format()とは?

date_interval_format()は、DateIntervalオブジェクトを指定したフォーマットで文字列に変換する関数です。期間を見やすく表示する際に重宝します。

🔰 基本的な使い方

$interval = new DateInterval('P1Y2M3D');
echo $interval->format('%y年%m月%d日'); // 1年2月3日

💡 フォーマット指定子一覧

指定子説明
%Y年(総年数)
%y
%M月(総月数)
%m
%D日(総日数)
%d
%H時(総時間)
%h
%I分(総分)
%i
%S秒(総秒)
%s
%R符号(+/-)
%r符号(+/-、0の場合は空)

🎯 実践的な使用例

1. 基本的な期間表示

$interval = new DateInterval('P1Y2M3DT4H5M6S');

// 様々な表示形式
echo $interval->format('%y年%m月%d日'); // 1年2月3日
echo $interval->format('%h時間%i分%s秒'); // 4時間5分6秒
echo $interval->format('%y Years, %m Months, %d Days'); // 1 Years, 2 Months, 3 Days

2. 経過時間の表示

function getElapsedTime($start, $end) {
    $interval = $start->diff($end);

    if ($interval->y > 0) {
        return $interval->format('%y年前');
    } elseif ($interval->m > 0) {
        return $interval->format('%mヶ月前');
    } elseif ($interval->d > 0) {
        return $interval->format('%d日前');
    } elseif ($interval->h > 0) {
        return $interval->format('%h時間前');
    } elseif ($interval->i > 0) {
        return $interval->format('%i分前');
    } else {
        return $interval->format('%s秒前');
    }
}

// 使用例
$start = new DateTime('2024-01-01');
$end = new DateTime('2024-02-15');
echo getElapsedTime($start, $end); // 1ヶ月前

3. 残り時間のカウントダウン

function getCountdown($targetDate) {
    $now = new DateTime();
    $target = new DateTime($targetDate);
    $interval = $now->diff($target);

    return $interval->format(
        '%adays %hhrs %imin %ssec'
    );
}

// 使用例
echo getCountdown('2024-12-31');

📝 カスタムフォーマット例

1. 日本語での詳細表示

function formatIntervalJapanese($interval) {
    $parts = [];

    if ($interval->y > 0) $parts[] = $interval->format('%y年');
    if ($interval->m > 0) $parts[] = $interval->format('%mヶ月');
    if ($interval->d > 0) $parts[] = $interval->format('%d日');
    if ($interval->h > 0) $parts[] = $interval->format('%h時間');
    if ($interval->i > 0) $parts[] = $interval->format('%i分');
    if ($interval->s > 0) $parts[] = $interval->format('%s秒');

    return implode('', $parts);
}

2. SNS風の表示

function formatIntervalSNS($interval) {
    if ($interval->y > 0) return $interval->y . 'y';
    if ($interval->m > 0) return $interval->m . 'mo';
    if ($interval->d > 0) return $interval->d . 'd';
    if ($interval->h > 0) return $interval->h . 'h';
    if ($interval->i > 0) return $interval->i . 'm';
    return $interval->s . 's';
}

⚠️ 注意点とエラー処理

try {
    $interval = new DateInterval('invalid');
} catch (Exception $e) {
    echo "エラー: " . $e->getMessage();
}

// nullチェック
function safeFormatInterval($interval, $format) {
    if (!$interval) {
        return 'Invalid interval';
    }
    return $interval->format($format);
}

💡 応用テクニック

1. 期間の比較と表示

function compareAndFormatIntervals($interval1, $interval2) {
    $total1 = $interval1->days;
    $total2 = $interval2->days;

    if ($total1 > $total2) {
        return $interval1->format('%a日長い');
    } elseif ($total1 < $total2) {
        return $interval2->format('%a日長い');
    }
    return '同じ期間です';
}

2. 進捗状況の表示

function formatProgress($startDate, $endDate) {
    $now = new DateTime();
    $start = new DateTime($startDate);
    $end = new DateTime($endDate);

    $total = $start->diff($end);
    $elapsed = $start->diff($now);

    $progress = ($elapsed->days / $total->days) * 100;

    return sprintf(
        '進捗状況: %.1f%% (%s経過)',
        $progress,
        $elapsed->format('%a日')
    );
}

まとめ

date_interval_format()は以下のような特徴があります:

  • 柔軟なフォーマット指定が可能
  • 様々な時間単位に対応
  • 日本語表示にも対応可能
  • SNSやWebアプリに適した表示形式の作成が容易

主な活用シーン:

  • 経過時間の表示
  • カウントダウン
  • 進捗状況の表示
  • 期間の比較表示

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