【PHP】これで分かる関数! – 日付・時刻その4 –

PHP

更新履歴

更新日更新者更新内容
2021/8/21JJI・”はじめに”の段落を追加
・サンプルプログラムの実行結果に画面の画像を追加

はじめに

日付・時刻の配列を表示する場合、次の記事で載せている関数を使用しています。

サンプルプログラムの実行結果に載せている画面とHTMLは違う時間で取得したため、実行結果の時間はずれています。

日付・時刻の計算

この記事では、次の日付・時刻の計算関数についてサンプルプログラムを使って説明します。

関数オブジェクト指向説明(PHPマニュアル抜粋)
date_modifyDateTime::modifyタイムスタンプを変更する
date_subDateTime::sub年月日時分秒の値を DateTime オブジェクトから引く

date_add/DateTime::add

date_add()、DateTime::add()関数は、日付・時刻を指定した分だけ加算・減算することができます。

この記事では指定した日付が直感的にわかりやすい相対的な書式を使用します
相対的な書式の詳細は次のPHPマニュアルを見てください。

https://www.php.net/manual/ja/datetime.formats.relative.php

date_add

date_add()関数を使用したサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:date_add()<br>\n";

    // デフォルトのタイムゾーンの指定
    echo "デフォルトのタイムゾーン指定(Asia/Tokyo)<br>\n";
    date_default_timezone_set("Asia/Tokyo");

    $dt1 = date_create();
    echo '現在の時刻[' . date_format($dt1, 'Y/m/d(D) H:i:s'). "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    echo '元の日付[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("30 seconds"));
    echo '30秒後[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("11 days"));
    echo '11日後[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("3 weeks"));
    echo '3週間後[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("13 months"));
    echo '13か月後[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("1 years"));
    echo '1年後[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("1 months + 25 days"));
    echo '1ヵ月25日後[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("-11 days"));
    echo '11日前[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_add($dt1, date_interval_create_from_date_string("-3 weeks"));
    echo '3週間前[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_04_08.php<br>
【PHP】関数<br>
日付・時刻関数:date_add()<br>
デフォルトのタイムゾーン指定(Asia/Tokyo)<br>
現在の時刻[2021/06/22(Tue) 07:16:18]<br>
元の日付[2010/03/15(Mon) 11:21:36]<br>
30秒後[2010/03/15(Mon) 11:22:06]<br>
11日後[2010/03/26(Fri) 11:21:36]<br>
3週間後[2010/04/05(Mon) 11:21:36]<br>
13か月後[2011/04/15(Fri) 11:21:36]<br>
1年後[2011/03/15(Tue) 11:21:36]<br>
1ヵ月25日後[2010/05/10(Mon) 11:21:36]<br>
11日前[2010/03/04(Thu) 11:21:36]<br>
3週間前[2010/02/22(Mon) 11:21:36]<br>

DateTime::add

DateTime::add()関数を使用したサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:DateTime::add()<br>\n";

    // デフォルトのタイムゾーンの指定
    echo "デフォルトのタイムゾーン指定(Asia/Tokyo)<br>\n";
    date_default_timezone_set("Asia/Tokyo");
    $dt1 = new DateTime();
    echo '現在の時刻[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    echo '元の日付[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("30 seconds"));
    echo '30秒後[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("11 days"));
    echo '11日後[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("3 weeks"));
    echo '3週間後[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("13 months"));
    echo '13か月後[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("1 years"));
    echo '1年後[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("1 months + 25 days"));
    echo '1ヵ月25日後[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("-11 days"));
    echo '11日前[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->add(DateInterval::createFromDateString("-3 weeks"));
    echo '3週間前[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_04_09.php<br>
【PHP】関数<br>
日付・時刻関数:DateTime::add()<br>
デフォルトのタイムゾーン指定(Asia/Tokyo)<br>
現在の時刻[2021/06/22(Tue) 07:21:01]<br>
元の日付[2010/03/15(Mon) 11:21:36]<br>
30秒後[2010/03/15(Mon) 11:22:06]<br>
11日後[2010/03/26(Fri) 11:21:36]<br>
3週間後[2010/04/05(Mon) 11:21:36]<br>
13か月後[2011/04/15(Fri) 11:21:36]<br>
1年後[2011/03/15(Tue) 11:21:36]<br>
1ヵ月25日後[2010/05/10(Mon) 11:21:36]<br>
11日前[2010/03/04(Thu) 11:21:36]<br>
3週間前[2010/02/22(Mon) 11:21:36]<br>

date_diff/DateTime::diff

date_diff()、DateTime::diff()関数は2つの日付の差を計算することができます。
計算した結果は次のPHPマニュアルに書いている形式で表示できます。

PHP: DateInterval::format - Manual

date_diff

date_diff()関数のサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:date_diff()<br>\n";

    // デフォルトのタイムゾーンの指定
    echo "デフォルトのタイムゾーン指定(Asia/Tokyo)<br>\n";
    date_default_timezone_set("Asia/Tokyo");
    $dt1 = date_create();
    echo '現在[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    $dt2 = date_create("2011/08/09 22:05:19");

    $dt_diff = date_diff($dt1, $dt2);
    echo '$dt2 - $dt1の総日数の差[' . date_interval_format($dt_diff, "%R%a日"). "]<br>\n";
    echo '$dt2 - $dt1の総日数の差[' . date_interval_format($dt_diff, "%y年%mヶ月%d日"). "]<br>\n";

    $dt_diff = date_diff($dt2, $dt1);
    echo '$dt1 - $dt2の総日数の差[' . date_interval_format($dt_diff, "%R%a日"). "]<br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_04_10.php<br>
【PHP】関数<br>
日付・時刻関数:date_diff()<br>
デフォルトのタイムゾーン指定(Asia/Tokyo)<br>
現在[2021/06/22(Tue) 07:59:24]<br>
$dt2 - $dt1の総日数の差[+512日]<br>
$dt2 - $dt1の総日数の差[1年4ヶ月25日]<br>
$dt1 - $dt2の総日数の差[-512日]<br>

DateTime::diff

DateTime::diff()関数のサンプルプログラムです。

<?php
    // 引数の値への厳密な型付け
    declare(strict_types = 1);

    require_once __DIR__ . "../../../lib/sample_common.php";

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:DateTime::diff()<br>\n";

    // デフォルトのタイムゾーンの指定
    echo "デフォルトのタイムゾーン指定(Asia/Tokyo)<br>\n";
    date_default_timezone_set("Asia/Tokyo");
    $dt1 = new DateTime();
    echo '現在[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt2 = new DateTime("2011/08/09 22:05:19");

    $dt_diff = $dt1->diff($dt2);
    echo '$dt2 - $dt1の総日数の差[' . $dt_diff->format("%R%a日"). "]<br>\n";
    echo '$dt2 - $dt1の総日数の差[' . $dt_diff->format("%y年%mヶ月%d日"). "]<br>\n";

    $dt_diff = $dt2->diff($dt1);
    echo '$dt1 - $dt2の総日数の差[' . $dt_diff->format("%R%a日"). "]<br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_04_11.php<br>
【PHP】関数<br>
日付・時刻関数:DateTime::diff()<br>
デフォルトのタイムゾーン指定(Asia/Tokyo)<br>
現在[2021/06/22(Tue) 08:01:06]<br>
$dt2 - $dt1の総日数の差[+512日]<br>
$dt2 - $dt1の総日数の差[1年4ヶ月25日]<br>
$dt1 - $dt2の総日数の差[-512日]<br>

コメント