更新履歴
更新日 | 更新者 | 更新内容 |
---|---|---|
2021/8/21 | JJI | ・”はじめに”の段落を追加 ・サンプルプログラムの実行結果に画面の画像を追加 |
はじめに
日付・時刻の配列を表示する場合、次の記事で載せている関数を使用しています。
サンプルプログラムの実行結果に載せている画面とHTMLは違う時間で取得したため、実行結果の時間はずれています。
日付・時刻の計算
この記事では、次の日付・時刻の計算関数についてサンプルプログラムを使って説明します。
関数 | オブジェクト指向 | 説明(PHPマニュアル抜粋) |
---|---|---|
date_modify | DateTime::modify | タイムスタンプを変更する |
date_sub | DateTime::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マニュアルに載っています。
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>
コメント