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

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

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

作成日: 更新日:

基本的な使い方

getTimestampメソッドは、DateTimeInterfaceインターフェースに定義されており、日付と時刻を扱うオブジェクトからUNIXタイムスタンプを取得するメソッドです。具体的には、PHPのDateTimeクラスやDateTimeImmutableクラスのインスタンスに対して呼び出すことができます。

このメソッドは、対象となる日時オブジェクトが表す日付と時刻を、1970年1月1日00:00:00 UTC(協定世界時)を基準とした経過秒数として、整数値で返します。この経過秒数のことをUNIXタイムスタンプと呼びます。

UNIXタイムスタンプは、世界中の異なるタイムゾーンや日付形式に依存せず、特定の日時を一意に、かつ数値として表現できるため、プログラム内で日付と時刻を処理する際に非常に有用です。例えば、2つの日付の前後関係を素早く比較したり、特定の日時が何秒前、あるいは何秒後であるかを計算したりする際に非常に役立ちます。データベースに日付を数値として保存する際や、異なるシステム間で日時情報を統一された形式でやり取りするAPI連携の場面でも広く活用されます。このメソッドは常に整数値を返し、PHP 8の環境で利用可能です。

構文(syntax)

1<?php
2
3$dateTime = new DateTime();
4$timestamp = $dateTime->getTimestamp();
5
6?>

引数(parameters)

引数なし

引数はありません

戻り値(return)

int

DateTimeInterface::getTimestamp メソッドは、Unixタイムスタンプ(1970年1月1日午前0時0分0秒UTCからの経過秒数)を表す整数値を返します。

サンプルコード

PHP getTimestamp でミリ秒タイムスタンプを取得する

1<?php
2
3/**
4 * DateTimeInterface::getTimestamp() を使用して、現在のUnixタイムスタンプをミリ秒単位で取得します。
5 *
6 * DateTimeInterface::getTimestamp() メソッドは秒単位のUnixタイムスタンプを返します。
7 * そのため、ミリ秒単位に変換するには、取得した値に1000を乗算する必要があります。
8 *
9 * @return int 現在時刻のUnixタイムスタンプ(ミリ秒単位)
10 */
11function getCurrentTimestampInMilliseconds(): int
12{
13    // 現在の日時を表すDateTimeオブジェクトを作成します。
14    $dateTime = new DateTime();
15
16    // getTimestamp() メソッドで、秒単位のUnixタイムスタンプを取得します。
17    // このメソッドは引数なしで、int型の値を返します。
18    $timestampInSeconds = $dateTime->getTimestamp();
19
20    // 秒単位のタイムスタンプをミリ秒単位に変換するために1000を乗算します。
21    $timestampInMilliseconds = $timestampInSeconds * 1000;
22
23    return $timestampInMilliseconds;
24}
25
26// 関数を実行し、ミリ秒単位のタイムスタンプを表示します。
27$currentMs = getCurrentTimestampInMilliseconds();
28echo "現在時刻のUnixタイムスタンプ (ミリ秒単位): " . $currentMs . PHP_EOL;
29
30// 参考として、秒単位のタイムスタンプも表示します。
31echo "現在時刻のUnixタイムスタンプ (秒単位): " . (new DateTime())->getTimestamp() . PHP_EOL;
32

PHPのDateTimeInterface::getTimestamp()メソッドは、DateTimeオブジェクトの日時データからUnixタイムスタンプを取得します。Unixタイムスタンプとは、1970年1月1日00:00:00 UTC(協定世界時)からの経過秒数を整数で表したものです。

このメソッドは引数を一切取らず、戻り値としてint型の秒単位Unixタイムスタンプを返します。そのため、もしシステムでミリ秒単位のタイムスタンプが必要な場合は、getTimestamp()が返す秒単位の数値に1000を乗算することで、ミリ秒単位の値に簡単に変換できます。

サンプルコードでは、まずnew DateTime()で現在のDateTimeオブジェクトを作成します。次に、そのオブジェクトに対してgetTimestamp()メソッドを呼び出し、秒単位のタイムスタンプを取得します。最後に、取得した秒単位の値を1000倍することでミリ秒単位に変換し、結果として表示しています。この一連の流れにより、PHPで現在時刻のUnixタイムスタンプを秒またはミリ秒単位で正確に扱うことが可能です。

DateTimeInterface::getTimestamp()メソッドは、Unixタイムスタンプを「秒」単位で返します。そのため、サンプルコードのように「ミリ秒」単位で扱いたい場合は、取得した値に1000を乗算する処理が必須です。この点を誤解すると、期待する時刻と大きく異なる値となってしまうため、特に注意してください。

戻り値は整数型(int)ですが、PHP 8のint型は通常64ビットをサポートするため、現在のタイムスタンプでオーバーフローの心配はほとんどありません。しかし、プログラムの移植性や将来的な大規模な数値計算を考慮する際は、数値型の特性を理解しておくことが重要です。また、DateTimeオブジェクトを生成する際は、タイムゾーンの設定によって対象となる時刻が異なる場合があるため、状況に応じて明示的に指定することをお勧めします。

PHP DateTime::getTimestamp()とタイムゾーンの影響

1<?php
2
3/**
4 * DateTimeInterface::getTimestamp() メソッドの使用例とタイムゾーンの影響を示します。
5 * Unixタイムスタンプは常にUTC基準で、特定の日時がUTCの1970年1月1日 00:00:00から何秒経過したかを表します。
6 */
7function demonstrateGetTimestampWithTimezones(): void
8{
9    // PHPのデフォルトタイムゾーンを設定(実行環境に依存するため明示的に設定することを推奨)
10    // 実際のアプリケーションでは、php.iniまたは設定ファイルで適切に管理してください。
11    date_default_timezone_set('Asia/Tokyo');
12    echo "現在のPHPデフォルトタイムゾーン: " . date_default_timezone_get() . "\n\n";
13
14    // 1. 特定のタイムゾーン (Asia/Tokyo) でDateTimeオブジェクトを作成
15    $dateTimeTokyo = new DateTime('2023-10-27 10:00:00', new DateTimeZone('Asia/Tokyo'));
16    echo "Asia/Tokyo での日時: " . $dateTimeTokyo->format('Y-m-d H:i:s e') . "\n";
17    echo "  -> getTimestamp(): " . $dateTimeTokyo->getTimestamp() . "\n\n";
18
19    // 2. 別のタイムゾーン (America/New_York) で「同じローカル時刻の文字列」のDateTimeオブジェクトを作成
20    $dateTimeNewYork = new DateTime('2023-10-27 10:00:00', new DateTimeZone('America/New_York'));
21    echo "America/New_York での日時: " . $dateTimeNewYork->format('Y-m-d H:i:s e') . "\n";
22    echo "  -> getTimestamp(): " . $dateTimeNewYork->getTimestamp() . "\n";
23    echo "  -> 注意: 同じローカル時刻の文字列でも、タイムゾーンが異なると指す「時点」が異なるため、タイムスタンプも異なります。\n\n";
24
25    // 3. 既存のDateTimeオブジェクトのタイムゾーンを変更する
26    // これにより、オブジェクトが指す「時点」は変わらず、表示形式と内部のタイムゾーン設定のみが変更されます。
27    // つまり、このDateTimeオブジェクトが表すUTCでの「時点」はそのままです。
28    $dateTimeTokyo->setTimezone(new DateTimeZone('America/New_York'));
29    echo "既存のオブジェクトのタイムゾーンを変更 (Asia/Tokyo -> America/New_York): " . $dateTimeTokyo->format('Y-m-d H:i:s e') . "\n";
30    echo "  -> getTimestamp(): " . $dateTimeTokyo->getTimestamp() . "\n";
31    echo "  -> 注意: 時刻表示は変わりましたが、指す「時点」は元の (Asia/Tokyo の 2023-10-27 10:00:00) のままなので、getTimestamp() の結果は変更前と変わりません。\n\n";
32
33    // 4. UnixタイムスタンプはUTCからの秒数であることを確認
34    // Asia/Tokyo の 2023-10-27 10:00:00 は、UTC の 2023-10-27 01:00:00 に相当します。
35    $dateTimeUtcEquivalent = new DateTime('2023-10-27 01:00:00', new DateTimeZone('UTC'));
36    echo "UTCでの等価な日時: " . $dateTimeUtcEquivalent->format('Y-m-d H:i:s e') . "\n";
37    echo "  -> getTimestamp(): " . $dateTimeUtcEquivalent->getTimestamp() . "\n";
38    echo "  -> 上記、最初の 'Asia/Tokyo での日時' の getTimestamp() 結果と一致することを確認してください。\n";
39    echo "  -> これは、getTimestamp() がDateTimeオブジェクトのタイムゾーンに関わらず、そのオブジェクトが指すUTCでの「時点」の秒数を返すためです。\n";
40}
41
42// 関数を実行して動作を確認
43demonstrateGetTimestampWithTimezones();

PHPのDateTimeInterface::getTimestamp()メソッドは、日付と時刻を扱うDateTimeオブジェクトが表す日時を、Unixタイムスタンプとして取得します。このメソッドは引数を取らず、整数型のUnixタイムスタンプを返します。

Unixタイムスタンプは、UTC(協定世界時)の1970年1月1日 00:00:00からの経過秒数を表す数値であり、常にUTC基準です。したがって、getTimestamp()が返す値は、DateTimeオブジェクトに設定されているタイムゾーンに関わらず、そのオブジェクトが指す「特定の時点」のUTCにおける秒数です。

例えば、DateTimeオブジェクトを「Asia/Tokyoの2023年10月27日10時」で作成した場合と、「America/New_Yorkの2023年10月27日10時」で作成した場合では、同じローカル時刻の文字列でも、指し示す「時点」が異なるため、getTimestamp()の戻り値も異なります。

しかし、一度作成したDateTimeオブジェクトに対し、setTimezone()メソッドでタイムゾーンを変更しても、そのオブジェクトが「指し示す時点」自体は変わらないため、getTimestamp()の戻り値は変化しません。このメソッドは、異なるタイムゾーンで扱われる日時データを、共通の基準で比較・保存する際に非常に役立ちます。

getTimestamp()は、PHPのDateTimeオブジェクトが表す「時点」を、常にUTC(協定世界時)の1970年1月1日0時0分0秒からの経過秒数として整数で返します。オブジェクト作成時に指定するタイムゾーンは、その日時文字列が「どの時点」を指すかを決定するため、getTimestamp()の結果に直接影響します。しかし、setTimezone()メソッドでオブジェクトのタイムゾーンを変更しても、それは「表示するタイムゾーン」が変わるだけで、オブジェクトが指す「時点」自体は変わらないため、getTimestamp()の結果は変更されません。意図しない結果を防ぐため、DateTimeオブジェクト作成時にはタイムゾーンを明示的に指定し、getTimestamp()が常にUTC基準であることを意識して利用してください。

関連コンテンツ