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_ATOM | DateTimeInterface::ATOM | 2005-08-15T15:52:01+00:00 |
DATE_COOKIE | DateTimeInterface::COOKIE | Monday, 15-Aug-2005 15:52:01 UTC |
DATE_RSS | DateTimeInterface::RSS | Mon, 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() システムコールをサポートする オペレーティングシステムでのみ使用できます。