Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】DateTimeInterface::getOffset()メソッドの使い方

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

作成日: 更新日:

基本的な使い方

getOffsetメソッドは、指定された日付/時刻オブジェクトが持つタイムゾーンの、協定世界時(UTC)からのオフセット値(差分)を秒単位で取得するメソッドです。このメソッドは、PHPのバージョン8を含む環境において、DateTimeクラスやDateTimeImmutableクラスなど、DateTimeInterfaceインターフェースを実装している全てのオブジェクトで利用できます。

このメソッドが返すオフセット値は、UTCを基準として、対象の日付/時刻がどれだけ進んでいるか、あるいは遅れているかを示します。例えば、日本標準時(JST)はUTCより9時間進んでいますので、このメソッドは正の整数値である32400(9時間 × 3600秒/時間)を返します。タイムゾーンによっては夏時間(サマータイム)が適用されることがありますが、getOffsetメソッドはその考慮も含めて、指定された日付/時刻時点での正確なオフセットを計算して返します。

システム開発においては、異なるタイムゾーン間の時刻を比較したり、世界中で一貫した時刻処理を行う上で、このオフセット情報が不可欠です。特に、複数の国や地域でサービスを展開するシステムでは、ユーザーのローカルタイムとサーバーのタイムゾーン、またはデータベースに保存されたUTC時刻との間で正確な時刻変換を行うために、getOffsetメソッドが活用されます。このメソッドは、常に整数値を返却し、正の数はUTCよりも時間が進んでいることを、負の数は遅れていることを示します。

構文(syntax)

1<?php
2$dateTime = new DateTime('now', new DateTimeZone('Europe/Berlin'));
3$offsetInSeconds = $dateTime->getOffset();
4?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

このメソッドは、DateTimeInterfaceインターフェースを実装するオブジェクトが表す日時と、UTC(協定世界時)との時差(オフセット)を整数値で返します。この値は秒単位で表され、例えばUTCより1時間進んでいる場合は3600、30分遅れている場合は-1800となります。

サンプルコード

PHP DateTime getOffsetでUTCオフセットを取得する

1<?php
2
3/**
4 * 指定されたDateTimeオブジェクトのUTCからのオフセット情報を表示します。
5 * getOffset() メソッドは、設定されたタイムゾーンとUTCとの差分を秒単位で返します。
6 *
7 * @param DateTimeInterface $dateTime オフセットを取得するDateTimeまたはDateTimeImmutableオブジェクト
8 * @return void
9 */
10function displayOffsetInfo(DateTimeInterface $dateTime): void
11{
12    // 現在のタイムゾーン名を取得
13    $timezoneName = $dateTime->getTimezone()->getName();
14
15    // getOffset() メソッドを使用して、UTCからのオフセットを秒単位で取得します。
16    $offsetSeconds = $dateTime->getOffset();
17
18    // 秒単位のオフセットを時間と分に変換します。
19    // オフセットが負の場合でも正確に表示するために、絶対値とsprintfを使用します。
20    $offsetHours = (int)($offsetSeconds / 3600);
21    $offsetMinutes = (int)(abs($offsetSeconds % 3600) / 60);
22
23    echo "タイムゾーン: " . $timezoneName . "\n";
24    echo "UTCからのオフセット (秒): " . $offsetSeconds . "秒\n";
25    echo "UTCからのオフセット (時:分): " . sprintf("%+d:%02d", $offsetHours, $offsetMinutes) . "\n\n";
26}
27
28// 実行例1: ロンドンのタイムゾーンでのオフセット
29// ロンドンは通常UTC±0ですが、夏時間期間はUTC+1になることがあります。
30echo "--- ロンドン (Europe/London) ---\n";
31$londonDateTime = new DateTime('now', new DateTimeZone('Europe/London'));
32displayOffsetInfo($londonDateTime);
33
34// 実行例2: 東京のタイムゾーンでのオフセット
35// 東京はUTC+9です。
36echo "--- 東京 (Asia/Tokyo) ---\n";
37$tokyoDateTime = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
38displayOffsetInfo($tokyoDateTime);
39
40// 実行例3: ニューヨークのタイムゾーンでのオフセット
41// ニューヨークは通常UTC-5ですが、夏時間期間はUTC-4になることがあります。
42echo "--- ニューヨーク (America/New_York) ---\n";
43$newYorkDateTime = new DateTime('now', new DateTimeZone('America/New_York'));
44displayOffsetInfo($newYorkDateTime);
45
46?>

DateTimeInterface::getOffset() メソッドは、PHPで日付と時刻を扱う際に、指定された DateTime または DateTimeImmutable オブジェクトに設定されているタイムゾーンと、協定世界時(UTC)との差分(オフセット)を取得するために使用されます。このメソッドは引数を取りません。呼び出すだけで、設定されたタイムゾーンにおけるUTCからのオフセット値を整数値として返します。戻り値は常に秒単位であり、例えばUTC+9時間であれば 32400 (9 * 3600) が、UTC-5時間であれば -18000 (-5 * 3600) が返されます。

サンプルコードでは、まず DateTime オブジェクトを作成し、そのオブジェクトの getOffset() メソッドを呼び出してオフセットを秒単位で取得しています。取得した秒単位のオフセットは、人間が理解しやすいように時間と分に変換され、現在のタイムゾーン名と共に表示されます。これにより、ロンドン、東京、ニューヨークといった異なるタイムゾーンにおけるUTCからの正確なオフセットを簡単に確認できます。特に、夏時間(DST)が適用される期間では、タイムゾーンのオフセットが自動的に調整された値が取得されるため、正確な時刻計算やタイムゾーン変換処理を行う際に非常に役立ちます。

getOffset()メソッドは、DateTimeオブジェクトに設定されたタイムゾーンと、その時点での夏時間(DST)を考慮した「UTCからの秒単位の差」を返します。戻り値は整数型で、正の値はUTCより進んでいる、負の値はUTCより遅れていることを示します。オフセットは設定されたタイムゾーンと日付によって変動するため、サンプルコードのように複数のケースで動作を確認すると理解が深まります。取得した秒数を時間や分に変換して表示する際は、負の値を含むオフセットを正しく処理するよう特に注意が必要です。絶対値の利用や符号の扱いに気をつけましょう。

PHP DateTimeInterface::getOffset() でタイムゾーンオフセットを取得する

1<?php
2
3/**
4 * 指定されたタイムゾーンの現在時刻におけるUTCからのオフセットを表示します。
5 *
6 * DateTimeInterface::getOffset() メソッドは、DateTimeオブジェクトが持つ
7 * タイムゾーンが、UTCからどれだけずれているかを秒単位で返します。
8 * システムエンジニアを目指す初心者向けに、秒数を時間と分に変換して表示します。
9 *
10 * @param string $timeZoneIdentifier 例: 'Asia/Tokyo', 'America/New_York'
11 */
12function displayTimeZoneOffset(string $timeZoneIdentifier): void
13{
14    // 1. 指定されたタイムゾーンを持つDateTimeZoneオブジェクトを作成します。
15    //    これは、特定の地域の時間帯情報をカプセル化したものです。
16    $timeZone = new DateTimeZone($timeZoneIdentifier);
17
18    // 2. 現在の日時と、上記で作成したタイムゾーンを持つDateTimeオブジェクトを作成します。
19    //    DateTimeオブジェクトはDateTimeInterfaceを実装しており、getOffset()メソッドが利用可能です。
20    $dateTime = new DateTime('now', $timeZone);
21
22    // 3. getOffset() メソッドを呼び出し、UTCからのオフセットを秒単位で取得します。
23    //    戻り値は整数 (int) です。
24    $offsetInSeconds = $dateTime->getOffset();
25
26    // 4. 取得したオフセット情報を表示します。
27    echo "タイムゾーン: " . $timeZoneIdentifier . "\n";
28    echo "UTCからのオフセット (秒): " . $offsetInSeconds . "秒\n";
29
30    // 5. 初心者にも分かりやすいように、秒数を時間と分に変換して表示します。
31    //    オフセットは正(UTCより進んでいる)または負(UTCより遅れている)になります。
32    $offsetHours = floor(abs($offsetInSeconds) / 3600); // 絶対値を取り時間部分を取得
33    $offsetMinutes = floor((abs($offsetInSeconds) % 3600) / 60); // 絶対値を取り分部分を取得
34
35    // 符号を決定し、時間と分の形式で表示します。
36    $sign = ($offsetInSeconds >= 0) ? '+' : '-';
37    echo "UTCからのオフセット (時間:分): " . $sign . sprintf("%02d:%02d", $offsetHours, $offsetMinutes) . "\n";
38    echo "--------------------------------\n";
39}
40
41// サンプルとして、いくつかの異なるタイムゾーンのオフセットを表示してみましょう。
42displayTimeZoneOffset('Asia/Tokyo');       // 日本のタイムゾーン
43displayTimeZoneOffset('America/New_York'); // アメリカ東部標準時のタイムゾーン
44displayTimeZoneOffset('Europe/London');    // イギリスのタイムゾーン (夏時間により変動する可能性あり)
45displayTimeZoneOffset('UTC');              // UTC自身のオフセットは常に0

PHP 8のDateTimeInterface::getOffset()メソッドは、DateTimeオブジェクトが持つ特定のタイムゾーンにおける現在時刻が、世界協定時(UTC)からどれだけずれているかを秒単位で取得する際に使用します。このメソッドは引数を必要とせず、UTCからのオフセットを整数(int)で返します。例えば、日本の「Asia/Tokyo」タイムゾーンの場合、通常はUTCより9時間進んでいるため、32400(9時間×3600秒)のような正の整数が戻り値として得られます。オフセットは、UTCより進んでいれば正の値、遅れていれば負の値となります。サンプルコードでは、まず指定されたタイムゾーンでDateTimeオブジェクトを作成し、そのオブジェクトに対してgetOffset()を呼び出しています。取得した秒単位のオフセットは、システムエンジニアを目指す初心者にも分かりやすいように、時間と分に変換して表示する処理も含まれており、国際的なシステムで正確な時間差を扱う上で非常に役立つ機能です。

getOffset()メソッドは、指定したDateTimeオブジェクトのタイムゾーンがUTCからどれだけずれているかを秒単位の整数で返します。オフセットは進んでいる場合は正、遅れている場合は負の値となるため、時間や分に変換する際には符号と絶対値の扱いに注意が必要です。DateTimeオブジェクトを生成する際には、DateTimeZoneを明示的に指定しないと、PHPのデフォルト設定が使われ意図しない結果になる可能性があります。特に、夏時間のあるタイムゾーンでは、指定した日付によってオフセットが変動する点にもご留意ください。常にUTCを基準としたオフセットが取得されます。

関連コンテンツ