PHPの日付の操作、計算などについて今回はご紹介します。
日付の計算は、プログラムの基本的な所なのですが、意外と使い方を知らないという方も多いです。WEB系のサービスでは日付の計算は多用しますので、使い方はぜひしっかりと覚えておきたい所ですね。
※個人的にも今後WEBカレンダーなどを作ってみたいと思っているので、日付の計算方法についてはしっかりと把握しておきたい部分です。
PHPに関する文献、情報は既に数多くあり、基本的な部分は、既によくまとめられている方のWEBページもありますので、そちらのページも紹介しつつ、改めて注意したいポイントを挙げていきます。本記事を読む事で、しっかりと日付のフォーマット設定や計算については理解を深めておきましょう。
実際にPHPのプログラムで日付を操作する事を想像しながら確認してみて下さいね。
コンテンツ
日付の取得「date関数」
PHPで日付の取得をする場合はdate関数を使います。
date関数については、こちらの方のサイトが非常によくまとめられいますので紹介します。
■URL(date関数について)
「https://webkaru.net/php/date/」
date関数は本記事で紹介する内容の基本となります。
ここでは現在日時の取得だけまずはやってみましょう。
現在日時の取得
実際に現在日時を取得してみましょう。
■PHPコード
1 2 3 |
<?php echo "現在日時は「".date("Y/m/d H:i:s") . "」だよ。"; ?> |
■実行結果
1 |
現在日時は「2018/10/25 02:46:06」だよ。 |
フォーマット指定の注意点
フォーマットがたくさんあるのでフォーマットを指定する際は要注意です。
特に気を付けた方が良いのが以下です。
・月を指定する場合
mは2桁表示(01,02など)、
nは1桁or2桁表示(1,2,10など)
・日付を指定する場合
dは2桁表示(01,02など)、
jは1桁or2桁表示(1,2,10など)
以下にサンプルを載せておきます。
※mktimeについては後ほど解説しますので、とりあえずdate関数のフォーマット部分だけご確認下さい。
■参考サンプルコード(実行結果はコード内のコメントに記載)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<?php //2018/1/1 01:02:03を表示 echo (date(("Y/m/d H:i:s"), mktime(1, 2, 3, 1, 1, 2018)))."\n"; //結果:2018/01/01 01:02:03 //年(y)⇒2桁表示 echo (date(("y/m/d H:i:s"), mktime(1, 2, 3, 1, 1, 2018)))."\n"; //結果:18/01/01 01:02:03 //月(n)⇒1~9の場合は1桁表示。 echo (date(("Y/n/d H:i:s"), mktime(1, 2, 3, 1, 1, 2018)))."\n"; //結果:2018/1/01 01:02:03 //日(j)⇒1~9の場合は1桁表示。 echo (date(("Y/m/j H:i:s"), mktime(1, 2, 3, 1, 1, 2018)))."\n"; //結果:2018/01/1 01:02:03 ?> |
日時の足し算、引き算「date関数+strtotime関数」
次に日時の足し算、引き算もやってみます。カレンダーなどを作ろうと思ったら、前月、次月の情報を取得できる方が便利です。
足し算や引き算にはstrtotime関数が役立ちます。
先ほどご紹介した方のサイトで、strtotime関数についても詳しく解説されていましたので、こちらのリンクも紹介しますね。※おせわになりっぱなしです。。。^^;
■URL(strtotime関数について)
「https://webkaru.net/php/date-strtotime/」
では、現在日時を基に、明日の日時、今年、来年、今月、来月などの情報を取得してみます。strototime関数を使うと非常に簡単に算出できます。
■PHPコード
1 2 3 4 5 6 7 8 |
<?php echo "現在日時は「".date("Y/m/d H:i:s") . "」だよ。\n"; echo "明日の今頃は「".date("Y/m/d H:i:s", strtotime("+1 day")) . "」だよ。\n"; echo "今年は「".date("Y") . "年」だよ。\n"; echo "来年は「".date("Y", strtotime("+1 year")) . "年」だよ。\n"; echo "今月は「".date("m月") . "」だよね。\n"; echo "来月は「".date("m月", strtotime("+1 month")) . "」だよ。\n"; ?> |
■実行結果
1 2 3 4 5 6 |
現在日時は「2018/10/25 03:01:33」だよ。 明日の今頃は「2018/10/26 03:01:33」だよ。 今年は「2018年」だよ。 来年は「2019年」だよ。 今月は「10月」だよね。 来月は「11月」だよ。 |
日付の設定「mktime関数」
さて、ここまでは現在時刻を基準にした例を挙げましたが、テストをする場合などに、自分で日付を設定したい事もありますよね。
そんな時はmktimeという関数を使います。
■関数
1 |
int mktime([int $hour [, int $minute [, int $second [, int $month [, int $day [, int $year]]]]]]) |
■引数(順番(特に、月、日、)に要注意)
$hour:時刻
$minute:分
$socond:秒
$month:月
$day:日
$year:年
mktimeで日時を指定してみる
実際に使ってみましょう。
mktimeだけだと、返り値はunixのタイムスタンプになります。
date関数と組み合わせる事で、綺麗な日付のフォーマットで出力しれくれます。
■PHPコード
1 2 3 4 |
<?php echo (mktime(6, 15, 30, 3, 20, 2018)."\n"); //タイムスタンプ echo (date(("Y/m/d H:i:s"), mktime(6, 15, 30, 3, 20, 2018))); //YYYY/MM/DD HH/MM/SS ?> |
■実行結果
1 2 |
1521526530 2018/03/20 06:15:30 |
dateの第二引数にmktimeで値を指定すると、指定した日時の値を取得してくれます。これで好きな日付をいつでも取得する事ができます。
mktimeの引数を省略すると
mktimeの引数は必須でないものもあります。
引数を省略した場合のコードを実行してみました。
■参考サンプルコード(実行結果はコード内のコメントに記載)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php echo (date("Y/m/d H:i:s"))."\n"; //結果:2018/10/31 05:16:41 //現在時刻 echo (date(("Y/m/d H:i:s"), mktime(1, 2, 3, 3, 20, 2018)))."\n"; //結果:2018/03/20 01:02:03 echo (date(("Y/m/d H:i:s"), mktime(1, 2, 3, 3, 20)))."\n"; //結果:2018/03/20 01:02:03 echo (date(("Y/m/d H:i:s"), mktime(1, 2, 3, 3)))."\n"; //結果:2018/03/31 01:02:03 echo (date(("Y/m/d H:i:s"), mktime(1, 2, 3)))."\n"; //結果:2018/10/31 01:02:03 echo (date(("Y/m/d H:i:s"), mktime(1, 2)))."\n"; //結果:2018/10/31 01:02:41 echo (date(("Y/m/d H:i:s"), mktime(1))); //結果:2018/10/31 01:16:41 ?> |
mktimeで時間を跨ぐ計算
mktime関数の優秀な所は、時間を跨ぐ計算も簡単に行ってくれる所です。
言語によっては、「23時」に「2時間」を足すと「25時」になる。なんて事があります。しかし、mktimeでは次の日に「1時」と判断してくれるのです。
C言語で開発をしていた時は、時刻跨ぎの計算をスクラッチでやってましたな。。。マジで大変でした。。。
mktimeを使うと簡単に日付を跨いでも綺麗に日時の計算をしてくれます。
■PHPコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php $wk_day = 50; $wk_month = 6; $wk_hour = 23; $wk_minute = 90; $wk_socond = 60; //初期値 echo (date(("Y/m/d H:i:s"), mktime(6, 15, 30, 3, 20, 2018))."\n"); //時間を跨ぐ echo (date(("Y/m/d H:i:s"), mktime(6, 15+$wk_minute, 30, 3, 20, 2018))."\n"); //分を跨ぐ echo (date(("Y/m/d H:i:s"), mktime(6, 15, 30+$wk_socond, 3, 20, 2018))."\n"); //日を跨ぐ echo (date(("Y/m/d H:i:s"), mktime(6+$wk_hour, 15, 30, 3, 20, 2018))."\n"); //月を跨ぐ echo (date(("Y/m/d H:i:s"), mktime(6, 15, 30, 3, 20+$wk_day, 2018))."\n"); //年を跨ぐ(前年) echo (date(("Y/m/d H:i:s"), mktime(6, 15, 30, 3-$wk_month, 20, 2018))."\n"); ?> |
■実行結果
1 2 3 4 5 6 |
2018/03/20 06:15:30 2018/03/20 07:45:30 2018/03/20 06:16:30 2018/03/21 05:15:30 2018/05/09 06:15:30 2017/09/20 06:15:30 |
月末日を取得する場合
さて、ここでは良く使うコードとして月末日の取得をしてみましょう。
何度も言いますが古い言語の場合は、2月の場合は28日まで、とか、4年に1回は29日まで、とか、100年に1回はうんぬんかんぬん、とか、マジで大変です。
PHPの場合は、その辺りの計算を綺麗にしてくれますので、使いやすいです。
月末日を指定する方法はいくつかあって、
・date関数のフォーマットで「t」を指定する
・mktimeの中で月+1を指定する
・strtotimeの中で一度dateで月初を指定して、第二引数で’+1 month’の様に記載する
これだけだと訳分からないですよね。サンプルのPHPコードをご確認下さい。
■参考URL(こちらも既に詳しくまとめていただいている方がいるのでサイトをご紹介します)
「https://qiita.com/akase244/items/e6c4835648a4e9a8678f」
■PHPコード(現在日が10/25の場合)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $year = date('Y'); $month = date('n'); echo $year."\n"; echo $month."\n"; echo date('Y-m-d')."\n"; echo date('Y-m-t')."\n"; echo date('Y-m-d', mktime(0, 0, 0, $month+1, 0, $year))."\n"; echo date('Y-m-t', strtotime(date('Y-m-01') . '-1 month'))."\n"; echo date('Y-m-t', strtotime(date('Y-m-01') . '+1 month')); ?> |
ご紹介のサイトでも記載されていますが、月末日の場合は、’Y-m-t’のフォーマットで求めた方が良い&strtotime内のdate関数では月初日を指定した方がベターの様です。
■実行結果
1 2 3 4 5 6 7 |
2018 10 2018-10-25 2018-10-31 2018-10-31 2018-09-30 2018-11-30 |
まとめ
今回はPHPで行う日付の操作、計算方法についてご紹介をしました。
今回紹介した方法であれば、日付操作については大体はカバーできるのではないかと思います。参考にさせていただいたサイト運営者の方にも本当に感謝です。
月末日を求める部分などは、ちょっとややこしかったと思います。なぜこうなるの?という視点だけだと頭が痛くなる様な構文なので、こういうものもあるんだと覚えておいて下さい。
今後、PHPでカレンダーなども作成しますので、今回ご紹介をした内容は改めて参考になると思います。