[PHP]date_isodate_set()関数の完全解説!ISO週番号を使った日付設定をマスターしよう

PHP

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

📅 date_isodate_set()とは?

date_isodate_set()は、ISO週番号(ISO-8601形式の週番号)を使用して日付を設定する関数です。年、週番号、曜日を指定して日付を設定できます。

🔰 基本的な構文

DateTime::setISODate(int $year, int $week, int $dayOfWeek = 1): DateTime

パラメータ:

  • year: 年
  • week: 週番号(1-53)
  • dayOfWeek: 曜日(1:月曜日 ~ 7:日曜日)

💡 基本的な使用例

1. 基本的な日付設定

$date = new DateTime();
$date->setISODate(2024, 1); // 2024年の第1週の月曜日
echo $date->format('Y-m-d'); 

2. 特定の曜日を指定

$date = new DateTime();
$date->setISODate(2024, 1, 3); // 2024年の第1週の水曜日
echo $date->format('Y-m-d');

🎯 実践的な使用例

1. 週ごとのスケジュール生成

function getWeekSchedule($year, $week) {
    $schedule = [];
    $date = new DateTime();

    for ($day = 1; $day <= 7; $day++) {
        $date->setISODate($year, $week, $day);
        $schedule[] = $date->format('Y-m-d (D)');
    }

    return $schedule;
}

// 使用例
$weekSchedule = getWeekSchedule(2024, 1);
foreach ($weekSchedule as $day) {
    echo $day . "\n";
}

2. 週番号の取得と設定

function getWeekInfo($dateString) {
    $date = new DateTime($dateString);
    $week = $date->format('W');
    $year = $date->format('o'); // ISO-8601年

    return [
        'week' => $week,
        'year' => $year,
        'date' => $date->format('Y-m-d')
    ];
}

// 使用例
$info = getWeekInfo('2024-01-15');
print_r($info);

📝 よく使うパターン

1. 第n週の月曜日を取得

function getMondayOfWeek($year, $week) {
    $date = new DateTime();
    $date->setISODate($year, $week, 1);
    return $date->format('Y-m-d');
}

2. 週の開始日と終了日を取得

function getWeekStartEnd($year, $week) {
    $date = new DateTime();

    // 週の開始日(月曜日)
    $date->setISODate($year, $week, 1);
    $start = $date->format('Y-m-d');

    // 週の終了日(日曜日)
    $date->setISODate($year, $week, 7);
    $end = $date->format('Y-m-d');

    return [
        'start' => $start,
        'end' => $end
    ];
}

⚠️ 注意点とエラー処理

function safeSetISODate($year, $week, $day = 1) {
    try {
        $date = new DateTime();
        $date->setISODate($year, $week, $day);
        return $date;
    } catch (Exception $e) {
        return "エラー: " . $e->getMessage();
    }
}

💡 応用テクニック

1. 週次レポートの生成

class WeeklyReport {
    private $year;
    private $week;
    private $date;

    public function __construct($year, $week) {
        $this->year = $year;
        $this->week = $week;
        $this->date = new DateTime();
        $this->date->setISODate($year, $week, 1);
    }

    public function getWeekRange() {
        $start = clone $this->date;
        $end = clone $this->date;
        $end->setISODate($this->year, $this->week, 7);

        return [
            'start' => $start->format('Y-m-d'),
            'end' => $end->format('Y-m-d')
        ];
    }

    public function getWeekNumber() {
        return $this->date->format('W');
    }
}

2. カレンダーの生成

function generateMonthlyCalendar($year, $month) {
    $date = new DateTime("$year-$month-01");
    $calendar = [];

    // 月の最初の週の週番号を取得
    $firstWeek = $date->format('W');

    // その月の週数分ループ
    for ($week = $firstWeek; $week <= $firstWeek + 5; $week++) {
        $weekDays = [];
        for ($day = 1; $day <= 7; $day++) {
            $date->setISODate($year, $week, $day);
            if ($date->format('n') == $month) {
                $weekDays[] = $date->format('j');
            } else {
                $weekDays[] = '';
            }
        }
        $calendar[] = $weekDays;
    }

    return $calendar;
}

まとめ

date_isodate_set()の主な特徴:

  • ISO週番号による日付設定が可能
  • 週ベースの日付操作に最適
  • カレンダー処理に便利
  • 国際的な週番号規格に準拠

活用シーン:

  • 週次レポートの生成
  • カレンダーアプリケーション
  • 週ベースのスケジュール管理
  • 国際的なプロジェクト管理

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