日付/時刻

DateTimeImmutable クラス

DateTimeクラスがカプセル化された情報を変更する(ミュータブル)のに対し、オブジェクトを変更しない(イミューターブル)。
ミュータブル(DateTimeクラス)は、modifyなどが呼ばれるとオブジェクトを変更する。初期化時の日付が変わる。
イミュータブル(DateTimeImmutableクラス)は、変わらない。

DateTime クラス

DateTimeオブジェクトを返す。
タイムゾーンを指定することもできる。省略した場合はphp.iniの設定に依存する。

文字列から生成する。解釈できる文字列は、
YYYY/MM/DD hh:mm:ss
YYYY-MM-DD
+2 weeks 2days 4 hours 10 minutes
など

日本語が混在する文字列は認識できない。その場合、createFromFormatメソッドを使用する。

//日本語混在文字列を使用する例
$fmt = 'Y年m月d日 H時i分s秒';
$time = '2023年08月10日 15時23分28秒';
$dt = DateTime::createFromFormat($fmt ,$time);
print $dt->format('Y-m-d H:i:s');

//結果:2023-08-10 15:23:28

diff メソッド

//オブジェクト思考型
DateTime::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval

//手続き型(日付/時刻 関数)
date_diff(DateTimeInterface $baseObject, DateTimeInterface $targetObject, bool $absolute = false): DateInterval

diffメソッドの戻り値は、DateIntervalオブジェクトです。内容はformatメソッドで取得する。
DateTimeクラスのformatメソッドと記述子が異なる点に注意。
$absoluteをtrueにすると絶対差を返す。つまり常に「+」になる。

$dt1 = new DateTime('2021/5/15 10:58:31');
$dt2 = new DateTime('2021/12/04');
$interval = $dt1->diff($dt2, true);
print $interval->format('%Y年%M月%d日 %H時間%I分%S秒');

//結果:00年06月18日 13時間01分29秒

DateIntervalオブジェクトの書式文字列で利用可能な記述子

(大文字は1桁の場合に先頭に0を補う)

記述子概要
%Y、%y
%M、%m
%D、%d
%a総日数
%H、%h時間
%I、%i
%S、%s
%F、%fマイクロ秒
%R、%r負数は「-」、整数は「+」(%rでは整数は空文字)

単に日付/時刻の大小を比較したい時は、比較演算子「<」「>」「==」を利用してください。
どちらのDateTimeオブジェクトが大きい(小さい)かを簡単に判定できます。

setDate メソッド

日付を設定する。

public DateTime::setDate(int $year, int $month, int $day): DateTime

setTime メソッド

時刻を設定する。

public DateTime::setTime(
int $hour,
int $minute,
int $second = 0,
int $microsecond = 0
): DateTime

modify メソッド

タイムスタンプを変更する。

public DateTime::modify(string $modifier): DateTime|false
$date = new DateTime('2022-12-12');
$date->modify('+1 day');
echo $date->format('Y-m-d');
//結果:2022-12-13

setTimestamp メソッド

Unix タイムスタンプを用いて日付と時刻を設定する。

public DateTime::setTimestamp(int $timestamp): DateTime

getTimestamp メソッド

Unix タイムスタンプを取得する。

public DateTime::getTimestamp(): int

DateTimeZone クラス

DateTimeオブジェクト生成時にTimeZoneを指定する例

$dt = new DateTime('now', new DateTimeZone('Asia/Tokyo'));

//現在時刻を取得するなら null でもOK
$dt = new DateTime(null, new DateTimeZone('Asia/Tokyo'));

DateInterval クラス

日付の加算/減算 add / sub メソッド

加算/減算する日付/時刻は、DateIntervalクラスで表します。

DateTime::add(DateInterval $interval): DateTime
DateTime::sub(DateInterval $interval): DateTime

引数は「P<日付間隔>T<時間間隔>」の形式で、「数値+単位」で表す。

$dt = new DateTime('2022/5/15 10:58:31');
print $dt->format('Y年m月d日 H時i分');
//結果:2022年05月15日 10時58分

$dt->add(new DateInterval('P1YT10H20M'));
print $dt->format('Y年m月d日 H時i分');
//結果:2023年05月15日 21時18分

$dt->sub(new DateInterval('P3MT20M'));
print $dt->format('Y年m月d日 H時i分');
//結果:2023年02月15日 20時58分

利用できる単位(間隔指示子)は以下の通り。

単位意味
Y
M
D
W週(Dと一緒には利用できない)
H時間
M
S

DatePeriod クラス

新しい DatePeriod オブジェクトを作成します。
DatePeriod オブジェクトは、 たくさんの DateTimeImmutable や DateTime を生成するイテレータとして使えます。foreach文で処理できる。

public DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    int $recurrences,
    int $options = 0
)

public DatePeriod::__construct(
    DateTimeInterface $start,
    DateInterval $interval,
    DateTimeInterface $end,
    int $options = 0
)

start
期間の開始日。デフォルトでは、 結果セットに含まれています。

interval
期間内での発生間隔。

recurrences反復回数(出力回数)。 返される結果の数は、この値よりひとつ大きくなります。 なぜなら、デフォルトでは結果セットに開始日が含まれているからです。 0 より大きな値でなければいけません。

end期間の終了日。 デフォルトでは、結果セットから除外されています。

isostr
ISO 8601 repeating interval specification のサブセットを指定します。

PHP がサポートしていない、サブセットの機能の例を以下に示します:
1. 0回の繰り返し (R0/)
2. UTC 以外の時間のオフセット(Z)。 たとえば +02:00 のようなものです。

options開始日と終了日に関する振る舞いを制御するビットフィールド

EXCLUDE_START_DATE開始日を期間の結果セットから除外
INCLUDE_END_DATE終了日を期間の結果セットに含める
$start = new DateTime('2012-07-01');
$interval = new DateInterval('P7D');
$end = new DateTime('2012-07-31');
$recurrences = 4;
$iso = 'R4/2012-07-01T00:00:00Z/P7D';

// これらはすべて同じ意味です
$period = new DatePeriod($start, $interval, $recurrences);
$period = new DatePeriod($start, $interval, $end);
$period = new DatePeriod($iso);

// DatePeriod の反復処理をすると、
// 期間内のすべての発生日が表示されます。
foreach ($period as $date) {
    echo $date->format('Y-m-d')."\n";
}

/* 出力
2012-07-01
2012-07-08
2012-07-15
2012-07-22
2012-07-29
*/

日付/時刻 関数

すべての日付/時刻関数は、 有効なタイムゾーンが設定されていない場合に E_WARNING  を発生させます。

date_default_timezone_set(string $timezoneId): bool

スクリプト中の日付/時刻関数で使用されるデフォルトタイムゾーンを取得する。

time(): int

現在の Unix タイムスタンプを返す。

//90日後のタイムスタンプ値を得る(クッキーの有効期限をセットする場合によく使う)
time() + (60 * 60 * 24 * 90);

mktime

指定した日付をタイムスタンプとして取得する。
引数の順番に注意!

mktime(
    int $hour,
    ?int $minute = null,
    ?int $second = null,
    ?int $month = null,
    ?int $day = null,
    ?int $year = null
): int|false

strtotime(string $datetime, ?int $baseTimestamp = null): int|false

英文形式の日付を Unix タイムスタンプに変換する。

date(string $format, ?int $timestamp = null): string

Unixタイムスタンプを書式化する。
$timestampが指定されなかったら現在の時刻。
$format は、DateTimeInterface::format() が受け入れるフォーマット。

$today = date("Y-m-d H:i:s");
print $today; //2023-12-01 02:53:03
主なフォーマット
文字説明戻り値の例
d日。二桁の数字(先頭にゼロがつく場合も)01 から 31
D曜日。3文字のテキスト形式。Mon から Sun
j日。先頭にゼロをつけない。1 から 31
l(小文字のL)曜日。フルスペル形式。Sunday から Saturday
L閏年であるかどうか。1なら閏年。0なら閏年ではない。
w曜日。数値。0 (日曜)から 6 (土曜)
z年間の通算日。数字。(ゼロから開始)0 から 365
F月。フルスペルの文字。January から December
m月。数字。先頭にゼロをつける。01 から 12
M月。3 文字形式。Jan から Dec
n月。数字。先頭にゼロをつけない。1から12
Y年。少なくとも4桁からなる数値。紀元前の場合は、- が付きます。例: -0055, 0787, 1999, 2003, 10191
y年。2 桁の数字。例: 99 または 03
eタイムゾーン識別子例: UTC, GMT, Atlantic/Azores
Oグリニッジ標準時 (GMT) との時差。時間と分の間にコロンは入りません。例: +0200
Pグリニッジ標準時 (GMT) との時差。時間と分をコロンで区切った形式例: +02:00

定義済定数も用意されている。

主な定義済み定数
定数インターフェイス定数
DATE_ATOMDateTimeInterface::ATOM2005-08-15T15:52:01+00:00
DATE_COOKIEDateTimeInterface::COOKIEMonday, 15-Aug-2005 15:52:01 UTC
DATE_RSSDateTimeInterface::RSSMon, 15 Aug 2005 15:52:01 +0000

gmdate(string $format, ?int $timestamp = null): string

date() 関数と同じですが、返される時刻が グリニッジ標準時 (GMT) であるところが異なります。

date_create(string $datetime = “now”, ?DateTimeZone $timezone = null): DateTime|false

新しい DateTime オブジェクトを作成する。

$origin = date_create('2009-10-11');
var_dump($origin);
/*
object(DateTime)#1 (3) {
  ["date"]=>
  string(26) "2009-10-11 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(3) "UTC"
}
*/

microtime(bool $as_float = false): string|float

現在の Unix タイムスタンプをマイクロ秒単位で返します。 この関数は、gettimeofday() システムコールをサポートする オペレーティングシステムでのみ使用できます。