こんにちは!今回は、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週番号による日付設定が可能
- 週ベースの日付操作に最適
- カレンダー処理に便利
- 国際的な週番号規格に準拠
活用シーン:
- 週次レポートの生成
- カレンダーアプリケーション
- 週ベースのスケジュール管理
- 国際的なプロジェクト管理