【PHP8.x】setISODateメソッドの使い方

setISODateメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

setISODateメソッドは、指定された年、週番号、そしてオプションで曜日に基づいて、DateTimeオブジェクトの日付を設定するメソッドです。このメソッドは、ISO 8601という国際標準の日付表現に準拠しており、特定の年の中の何週目の何曜日といった形式で日付を扱う際に非常に便利です。例えば、「2024年の第10週目の水曜日」のように、通常の月日ではなく、週の概念で日付を設定したい場合に利用します。

引数としては、year(年)、week(週番号)、そしてオプションでday(曜日)を受け取ります。dayには1(月曜日)から7(日曜日)までの整数を指定し、省略した場合はデフォルトで月曜日(1)が設定されます。ISO 8601標準では、週の始まりは月曜日と定義されており、その年の最初の木曜日を含む週を第1週と数えるため、このメソッドもその規則に従って日付を計算し、設定します。

設定が成功すると、更新されたDateTimeオブジェクト自身が返され、失敗した場合はfalseが返されます。この機能により、週ベースのスケジュール管理や国際的な日付データ処理において、正確で一貫性のある日付操作が可能となります。特に、週単位での集計や表示が求められるシステムにおいて、月日を直接指定するよりも直感的かつ柔軟な日付設定を実現できます。

構文(syntax)

1<?php
2$dateTime = new DateTime();
3$dateTime->setISODate(2023, 1, 1);
4?>

引数(parameters)

int $year, int $week, int $dayOfWeek = 1

  • int $year: ISO 8601 規格に準拠した西暦を指定する整数
  • int $week: ISO 8601 規格に準拠した週番号を指定する整数
  • int $dayOfWeek = 1: ISO 8601 規格に準拠した曜日を指定する整数 (1:月曜日, 7:日曜日)。省略時は月曜日(1)になります

戻り値(return)

DateTime|false

成功した場合は DateTime オブジェクト、失敗した場合は false を返します。

サンプルコード

PHP DateTime::setISODateでISO日付を設定する

1<?php
2
3/**
4 * Demonstrates the use of DateTime::setISODate method in PHP.
5 *
6 * This function illustrates how to set a DateTime object's date
7 * based on the ISO 8601 week date system. In this system, a year is
8 * defined by its week number and day of the week (Monday=1 to Sunday=7).
9 * This is particularly useful for calendar and scheduling systems
10 * that adhere to ISO week standards.
11 */
12function demonstrateDateTimeSetISODate(): void
13{
14    // 1. Initialize a new DateTime object.
15    // It defaults to the current date and time.
16    $dateTime = new DateTime();
17    echo "Initial date: " . $dateTime->format('Y-m-d (N: Monday=1) W:ISO Week') . PHP_EOL;
18
19    // 2. Set the date to a specific ISO year and week, using the default dayOfWeek (Monday).
20    $isoYear = 2023;
21    $isoWeek = 35; // For example, the 35th week of 2023
22    echo PHP_EOL . "--- Setting date to ISO year {$isoYear}, week {$isoWeek}, default day (Monday) ---" . PHP_EOL;
23
24    // The setISODate method returns the DateTime object on success, or false on failure.
25    $result = $dateTime->setISODate($isoYear, $isoWeek);
26
27    if ($result !== false) {
28        echo "Date after setISODate (Monday): " . $dateTime->format('Y-m-d (N: Monday=1) W:ISO Week') . PHP_EOL;
29        echo "Note: The 'N' value is 1, indicating Monday." . PHP_EOL;
30    } else {
31        echo "Error: Failed to set ISO date for year {$isoYear}, week {$isoWeek}." . PHP_EOL;
32    }
33
34    // 3. Set the date to the same ISO year and week, but a different day of the week (e.g., Friday).
35    $dayOfWeek = 5; // 5 represents Friday in ISO 8601 (1=Monday, 7=Sunday)
36    echo PHP_EOL . "--- Setting date to ISO year {$isoYear}, week {$isoWeek}, day {$dayOfWeek} (Friday) ---" . PHP_EOL;
37
38    $result = $dateTime->setISODate($isoYear, $isoWeek, $dayOfWeek);
39
40    if ($result !== false) {
41        echo "Date after setISODate (Friday): " . $dateTime->format('Y-m-d (N: Monday=1) W:ISO Week') . PHP_EOL;
42        echo "Note: The 'N' value is 5, indicating Friday." . PHP_EOL;
43    } else {
44        echo "Error: Failed to set ISO date for year {$isoYear}, week {$isoWeek}, day {$dayOfWeek}." . PHP_EOL;
45    }
46
47    // 4. Example with the last week of an ISO year to show year boundary handling.
48    // For 2023, the last ISO week is week 52.
49    $isoYearEndOfYear = 2023;
50    $isoWeekEndOfYear = 52;
51    $dayOfWeekEndOfYear = 7; // Sunday
52    echo PHP_EOL . "--- Setting date to ISO year {$isoYearEndOfYear}, week {$isoWeekEndOfYear}, day {$dayOfWeekEndOfYear} (Sunday) ---" . PHP_EOL;
53
54    $result = $dateTime->setISODate($isoYearEndOfYear, $isoWeekEndOfYear, $dayOfWeekEndOfYear);
55
56    if ($result !== false) {
57        echo "Date after setISODate (end of year Sunday): " . $dateTime->format('Y-m-d (N: Monday=1) W:ISO Week') . PHP_EOL;
58        echo "Observe how the actual month/day might fall into the next calendar year." . PHP_EOL;
59    } else {
60        echo "Error: Failed to set ISO date for year {$isoYearEndOfYear}, week {$isoWeekEndOfYear}, day {$dayOfWeekEndOfYear}." . PHP_EOL;
61    }
62}
63
64// Execute the demonstration.
65demonstrateDateTimeSetISODate();
66

PHP 8のDateTimeクラスに属するsetISODateメソッドは、日付をISO 8601週日付システムに基づいて設定する際に使用されます。このシステムでは、年、週番号、および週の曜日(月曜日を1とし、日曜日を7とする)を用いて特定の日付を表現します。

このメソッドは、DateTimeオブジェクトのインスタンスに対して呼び出され、引数としてint $yearで年を、int $weekでその年の週番号を、そしてオプションでint $dayOfWeekで週の曜日(デフォルトは1で月曜日)を指定します。従来の「年・月・日」といった形式ではなく、週単位での日付設定が可能になるため、ISO週番号を基準とするカレンダーやスケジュール管理システムにおいて特に有用です。

メソッドが日付の設定に成功した場合、更新されたDateTimeオブジェクト自身を返します。設定に失敗した場合はfalseを返しますので、戻り値を確認してエラー処理を行うことが重要です。サンプルコードでは、まずDateTimeオブジェクトを初期化し、その後、2023年の第35週の月曜日(デフォルト)と金曜日(dayOfWeekに5を指定)を設定する例を通じて、日付がISO週番号に基づいて正確に設定される様子を示しています。また、年末の週を設定する例から、実際の月日が次の暦年にまたがることがあるといった、ISO週の計算規則に厳密に従って日付が決定される挙動も確認できます。

DateTime::setISODateメソッドは、ISO 8601週日付システムに基づき日付を設定します。通常のカレンダーとは異なり、ISO年における週の開始(月曜日)と曜日(1=月曜日、7=日曜日)の概念を正しく理解することが重要です。特に、指定したISO年と週の実際の月日が、期待する暦年とずれる場合がある点に注意が必要です。このメソッドは成功時にDateTimeオブジェクトを返し、失敗時にはfalseを返しますので、必ず戻り値をチェックし、エラーハンドリングを適切に行う習慣をつけましょう。第3引数の$dayOfWeekはデフォルトで月曜日(1)に設定されますが、具体的な曜日を指定する際は、1から7の範囲で指定してください。

【PHP8.x】setISODateメソッドの使い方 | いっしー@Webエンジニア