LABO IWASAKI

PHP strtotime

日付計算の色々

すごく書こうかどうか迷いました。
毎回うんざりする最も嫌いな部類だからです。
この日付の計算だけは本当に嫌い(苦手)なので

今日から1年前の今日までの日付
一つのファイルにまとめて毎回includeしてます。
他によい方法を見つける気にすらなってない…。

日付を取得する

PHP Date & Time

まず日付を取得してみます。
日付を求めるのって色々ありますが、ここでは「strtotime」を使います。
すみませんが、読み方分かんないです。

$nowy = date("Y");
$nowm = date("m");
$nowd = date("d");

例えばこんな風に簡単に求める事ができます。
$nowy => 2018
$nowm => 12
$nowd => 15
今日の日付になってますね。
この「date("Y")」のアルファベットを変えると取得するものが変わります。

年の色々

PHP Date - YEAR

年はこんなタイプがあります。

$year1 = date("Y");
$year2 = date("y");
$year3 = date("L");

$year1 => 2018
$year2 => 18
$year3 => 0
date("L")」は閏年かどうかの判定です。1なら閏年。0なら違います。

月の色々

PHP Date - MONTH

月はこんなにいっぱいあります。
mnは使い方に注意したいですね。

$month1 = date("m");
$month2 = date("n");
$month3 = date("F");
$month4 = date("M");
$month5 = date("t");

$month1 => 12(01〜12)
$month2 => 12(1から12)
$month3 => December
$month4 => Dec
$month5 => 31
date("t")」は、その月の最終日を取得してくれます。これ結構便利です。

日の色々

PHP Date - Day

日はこんな感じです。
使ってるアルファベットが疑問ですw。

$day1 = date("d");
$day2 = date("j");
$day3 = date("z");

$day1 => 15(01〜31)
$day2 => 15(1〜31)
$day3 => 348
date("z")」は、年間の通算日です。でもスタートは1ではなく0なので注意が必要です。

時間の色々

PHP Date - Time

いっぱいあるけどこんな感じです。

$time1 = date("g");
$time2 = date("G");
$time3 = date("h");
$time4 = date("H");
$time5 = date("i");
$time6 = date("s");
$time7 = date("a");
$time8 = date("A");

$time1 => 4(1〜12)
$time2 => 16(0〜23)
$time3 => 04(01〜12)
$time4 => 16(00〜23)
$time5 => 03(00〜59)分
$time6 => 19(00〜59)秒
$time7 => pm(am pm
$time8 => PM(AM PM

DateTime

PHP strtotime

strtotimeを使っていきます。
この辺はまだ簡単でいいなぁ…。

$now = date("Y-m-d H:i:s");
$tom = date("Y-m-d H:i:s",strtotime("+1 day"));
$yes = date("Y-m-d H:i:s",strtotime("-1 day"));

$now => 2018-12-15 16:03:19
$tom => 2018-12-16 16:03:19(明日の今)
$yes => 2018-12-14 16:03:19(昨日の今)

$now1 = date("Y-m-d");
$month1 = date("Y-m-d",strtotime("+1 month"));
$month2 = date("Y-m-d",strtotime("-1 month"));

$now1 => 2018-12-15
$month1 => 2019-01-15
$month2 => 2018-11-15

$year1 = date("Y-m-d",strtotime("+1 year"));
$year2 = date("Y-m-d",strtotime("-1 year"));

$year1 => 2019-12-15
$year2 => 2017-12-15

$hour1 = date("Y-m-d H:i:s",strtotime("+1 hour"));
$hour2 = date("Y-m-d H:i:s",strtotime("-1 hour"));

$hour1 => 2018-12-15 17:03:19
$hour2 => 2018-12-15 15:03:19

$minute1 = date("Y-m-d H:i:s",strtotime("+1 minute"));
$minute2 = date("Y-m-d H:i:s",strtotime("-1 minute"));

$minute1 => 2018-12-15 16:04:19
$minute2 => 2018-12-15 16:02:19

$second1 = date("Y-m-d H:i:s",strtotime("+1 second"));
$second2 = date("Y-m-d H:i:s",strtotime("-1 second"));

$second1 => 2018-12-15 16:03:20
$second2 => 2018-12-15 16:03:18

ここからが嫌いすぎるところです。
strtotimeって単語がすでに嫌いになってます。
もしも、変数で年月日が飛んできて、さらに、○分後、などの指定も変数で来た場合です。

変数がやってきた

Strtotime Change

日付や調整する数字が全部変数で飛んできて
さらに、その中から各項目だけを抽出しています。
settimeoutと組み合わせてタイマーを作った事があり、その時に使いました。

//年月日
$nowy = $_POST["nowy"];
$nowm = $_POST["nowm"];
$nowd = $_POST["nowd"];


//時分秒
$hour = $_POST["hour"];
$minu = $_POST["minu"];
$sec = $_POST["sec"];


//○分後という指定数字
$change = $_POST["change"]; //○分後の数字が入っている(仮に30とします)


//まず全部繋げて日付の形式にします。
$catch1 = "{$nowy}-{$nowm}-{$nowd} {$hour}:{$minu}:{$sec}"; //例2015-02-10 16:40:00
$catch2 = strtotime($catch1); //strtotimeに変換


//指定された時間をプラスします。
$catch3 = strtotime("+{$change} minute", $catch2); //時間をプラス 引数の場所に注意


//表示したい形式を指定します。
$catch4 = date("Y-m-d H:i:s", $catch3); //$catch3のフォーマットを指定


//それぞれを単品で抜き出します。
$ch = date("H",strtotime($catch4)); //時間だけ取り出す
$cm = date("i",strtotime($catch4)); //分だけ取り出す
$cs = date("s",strtotime($catch4)); //秒だけ取り出す

$catch1 => 2018-12-15 16:03:19
$catch2 => 1544857399
$catch3 => 1544859199
$catch4 => 2018-12-15 16:33:19
$ch => 16
$cm => 33
$cs => 19
ついでなので曜日も取ってみましょう。

//まず表示したい曜日文字を配列に入れます
$arweek = array("日", "月", "火", "水", "木", "金", "土");


//さっきの $catch4を使います。
$time1 = strtotime($catch4);


//曜日の数字を取得します
$week1 = date("w", $time1);


//配列に照らし合わせます
$week = $arweek[$week1];

$arweek => Array
$time1 => 1544859199
$week1 => 6
$week => 土
こんな感じになります。

曜日の色々

PHP Day of the Week

上でちょっと出てきたので、曜日の色々も置いておきます。

$week1 = date("D");
$week2 = date("l");//小文字のLです
$week3 = date("w");
$week4 = date("N");

$week1 => Sat
$week2 => Saturday
$week3 => 6
$week4 => 6
$week4の「N」はISO-8601 形式の曜日の数値表現