[PHP]date_sub()関数完全解説!日付の減算をマスターしよう

PHP

こんにちは!今回は、PHPの日付処理で使用されるdate_sub()関数について詳しく解説していきます。

📅 date_sub()とは?

date_sub()は、DateTimeオブジェクトから特定の期間を引くための関数です。
DateIntervalオブジェクトを使用して期間を指定します。

🔰 基本的な使用法

$date = new DateTime('2024-01-15');
$interval = new DateInterval('P1D'); // 1日
$date->sub($interval);
echo $date->format('Y-m-d'); // 2024-01-14

💡 期間指定のフォーマット

DateIntervalの主な指定子

  • P: 期間の指定を開始
  • Y: 年
  • M: 月
  • D: 日
  • T: 時刻の指定を開始
  • H: 時間
  • M: 分
  • S: 秒

🎯 実践的な使用例

1. 基本的な日付の減算

function subtractFromDate($date, $years = 0, $months = 0, $days = 0) {
    $datetime = new DateTime($date);
    $interval = new DateInterval(
        sprintf('P%dY%dM%dD', $years, $months, $days)
    );
    $datetime->sub($interval);
    return $datetime->format('Y-m-d');
}

// 使用例
echo subtractFromDate('2024-01-15', 1, 2, 3); // 1年2ヶ月3日前

2. 営業日の計算

function subtractBusinessDays($date, $days) {
    $datetime = new DateTime($date);
    $interval = new DateInterval('P1D');

    while ($days > 0) {
        $datetime->sub($interval);
        // 土日をスキップ
        if ($datetime->format('N') >= 6) continue;
        $days--;
    }

    return $datetime->format('Y-m-d');
}

📝 様々な減算パターン

1. 時間の減算

function subtractTime($datetime, $hours = 0, $minutes = 0, $seconds = 0) {
    $date = new DateTime($datetime);
    $interval = new DateInterval(
        sprintf('PT%dH%dM%dS', $hours, $minutes, $seconds)
    );
    $date->sub($interval);
    return $date->format('Y-m-d H:i:s');
}

// 使用例
echo subtractTime('2024-01-15 14:30:00', 2, 30, 15);

2. 複合的な期間の減算

function subtractComplex($date, $spec) {
    $datetime = new DateTime($date);
    $interval = new DateInterval($spec);
    $datetime->sub($interval);
    return $datetime->format('Y-m-d H:i:s');
}

// 使用例
echo subtractComplex('2024-01-15', 'P1Y2M3DT4H5M6S');

⚠️ エラー処理

function safeSubtract($date, $interval) {
    try {
        $datetime = new DateTime($date);
        $dateInterval = new DateInterval($interval);
        $datetime->sub($dateInterval);
        return [
            'success' => true,
            'result' => $datetime->format('Y-m-d H:i:s')
        ];
    } catch (Exception $e) {
        return [
            'success' => false,
            'error' => $e->getMessage()
        ];
    }
}

💡 応用テクニック

1. 期間計算クラス

class DateCalculator {
    private $datetime;

    public function __construct($date) {
        $this->datetime = new DateTime($date);
    }

    public function subtractYears($years) {
        $this->datetime->sub(new DateInterval("P{$years}Y"));
        return $this;
    }

    public function subtractMonths($months) {
        $this->datetime->sub(new DateInterval("P{$months}M"));
        return $this;
    }

    public function subtractDays($days) {
        $this->datetime->sub(new DateInterval("P{$days}D"));
        return $this;
    }

    public function getResult($format = 'Y-m-d') {
        return $this->datetime->format($format);
    }
}

// 使用例
$calc = new DateCalculator('2024-01-15');
echo $calc->subtractYears(1)
         ->subtractMonths(2)
         ->subtractDays(3)
         ->getResult();

2. 日付範囲の生成

function generateDateRange($endDate, $days) {
    $dates = [];
    $end = new DateTime($endDate);
    $interval = new DateInterval('P1D');

    for ($i = 0; $i < $days; $i++) {
        $dates[] = $end->format('Y-m-d');
        $end->sub($interval);
    }

    return $dates;
}

まとめ

date_sub()の主な特徴:

  • DateTimeオブジェクトから期間を減算
  • DateIntervalを使用して柔軟な期間指定
  • チェーンメソッドでの連続操作が可能
  • エラー処理の重要性

活用シーン:

  • 期限の計算
  • 営業日の算出
  • スケジュール管理
  • 期間範囲の生成
タイトルとURLをコピーしました