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

PHP

更新履歴

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

はじめに

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

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

日付・時刻の計算

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

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

date_modify/DateTime::modify

date_modify()、DateTime::modify()関数はdate_add()、DateTime::add()と同様に日付・時刻を指定した分だけ計算可能です。

date_add()、DateTime::add()関数とは異なり、date_modify()、DateTime::modify()関数は今月の月末日(”last day of this month”)といった指定が可能です。

date_modify()、DateTime::modify()関数で指定可能な日付の形式は次のPHPマニュアルに載っています。

PHP: 相対的な書式 - Manual

date_modify

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

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

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

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:date_modify()<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_modify($dt1, "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_modify($dt1, "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_modify($dt1, "last day of this month");
    echo '月末日[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = date_create("2010/03/15 11:21:36");
    date_modify($dt1, "last day of previous month");
    echo '先月の月末日[' . date_format($dt1, 'Y/m/d(D) H:i:s') . "]<br>\n";

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

実行結果です。

・画面

・HTML

ファイル名:sample02_04_12.php<br>
【PHP】関数<br>
日付・時刻関数:date_modify()<br>
デフォルトのタイムゾーン指定(Asia/Tokyo)<br>
現在の時刻[2021/06/22(Tue) 08:26:59]<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>
月末日[2010/03/31(Wed) 11:21:36]<br>
先月の月末日[2010/02/28(Sun) 11:21:36]<br>
3週間後の水曜日[2010/04/07(Wed) 00:00:00]<br>

DateTime::modify

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

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

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

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:new DateTime::modify()<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->modify("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->modify("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->modify("last day of this month");
    echo '月末日[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->modify("last day of previous month");
    echo '先月の月末日[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";

    $dt1 = new DateTime("2010/03/15 11:21:36");
    $dt1->modify("wednesday +3 weeks");
    echo '3週間後の水曜日[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";
?>

実行結果です。

・画面

・HTML

ファイル名:sample02_04_13.php<br>
【PHP】関数<br>
日付・時刻関数:new DateTime::modify()<br>
デフォルトのタイムゾーン指定(Asia/Tokyo)<br>
現在の時刻[2021/06/22(Tue) 08:30:37]<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>
月末日[2010/03/31(Wed) 11:21:36]<br>
先月の月末日[2010/02/28(Sun) 11:21:36]<br>
3週間後の水曜日[2010/04/07(Wed) 00:00:00]<br>

date_sub/DateTime::sub

date_sub()、DateTime::sub()関数はdate_add()、DateTime::add()関数と逆の動きになります。
両方を覚える必要はないです。
分かりやすいのはdate_add()、DateTime::add()関数になると思います。

一応、date_sub()、DateTime::sub()関数を使用したサンプルプログラムも載せておきます。

date_sub

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

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

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

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:date_sub()<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_sub($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_sub($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_sub($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_sub($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_sub($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_sub($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_sub($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_sub($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_14.php<br>
【PHP】関数<br>
日付・時刻関数:date_sub()<br>
デフォルトのタイムゾーン指定(Asia/Tokyo)<br>
現在の時刻[2021/06/22(Tue) 08:35:39]<br>
元の日付[2010/03/15(Mon) 11:21:36]<br>
30秒前[2010/03/15(Mon) 11:21:06]<br>
11日前[2010/03/04(Thu) 11:21:36]<br>
3週間前[2010/02/22(Mon) 11:21:36]<br>
13か月前[2009/02/15(Sun) 11:21:36]<br>
1年前[2009/03/15(Sun) 11:21:36]<br>
1ヵ月25日前[2010/01/21(Thu) 11:21:36]<br>
11日後[2010/03/26(Fri) 11:21:36]<br>
3週間後[2010/04/05(Mon) 11:21:36]<br>

DateTime::sub

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

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

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

    echo "ファイル名:" . basename(__FILE__) . "<br>\n";
    echo "【PHP】関数<br>\n";
    echo "日付・時刻関数:DateTime::sub()<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->sub(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->sub(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->sub(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->sub(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->sub(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->sub(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->sub(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->sub(DateInterval::createFromDateString("-3 weeks"));
    echo '3週間後[' . $dt1->format('Y/m/d(D) H:i:s') . "]<br>\n";
?>

実行結果です。

・画面

・HTML

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

コメント