日付の操作というのはプログラミングを行っていればちょくちょく出てきますが、何かとやっかいです。
あまり頻繁に使わない分つい忘れてしまうんです(笑)
PHPなどのプログラミングでの操作もありますが、仕様的な注意点もあります。
今回はPHPで日付を扱う方法や注意点などをまとめてみます。
現在の日付を取得する方法
1 |
$now = date('Y/m/d'); |
時間も取得したい場合は以下のように書きます。
1 |
$now = date('Y/m/d H:i:s'); |
お気づきかもしれませんが、
- Y・・・年
- m・・・月
- d・・・日
- H・・・時
- i・・・分
- s・・・秒
となります。
大文字小文字にも意味がありますので注意してください。
また、DateTimeクラスを使って日付を取得するのは以下のように書きます。
1 2 |
$now = new DateTime(); echo $now->format('Y/m/d'); |
時間も取得する場合は以下のようになります。
1 2 |
$now = new DateTime(); echo $now->format('Y/m/d H:i:s'); |
フォーマットを指定する
1 |
$now = date('Y年m月d日 H時i分s秒'); |
このようにYやmの部分だけはそのままに他の部分を変更すると指定したフォーマットで取得できます。
上のコードを実行すると以下のように表示されます。
2018年10月15日 09時12分12秒
文字列から日付オブジェクトを作成する方法
1 |
$date = date('Y年m月d日 H時i分s秒',strtotime('2018-06-03 15:26:05')); |
実行すると以下のような文字列を取得できます。
2018年06月03日 15時26分05秒
DateTimeクラスを使う場合は、
1 2 |
$date = new DateTime('2018-06-03 15:26:05'); echo $now->format('Y年m月d日 H時i分s秒'); |
のように書きます。
こちらも ‘20180603152605’ のように日付を渡してもちゃんと読み込んでくれます。
出力を、
1 |
echo $now->format('Y/m/d'); |
のように書くと年月日だけ出力できます。
日を足し算引き算する方法
現在から足し算して翌日を取得する場合は、
1 |
echo date("Y/m/d", strtotime("1 day")); |
のように書きます。
現在から引き算をして前日を取得する場合は、
1 |
echo date("Y/m/d", strtotime("-1 day")); |
のように書きます。
日付を指定して足し算引き算をする場合は、
1 2 |
echo date("Y/m/d", strtotime("2018-06-18 1 day")); echo date("Y/m/d", strtotime("2018-06-18 -1 day")); |
のように書きます。
DateTimeクラスを使って現在の日付から足し算引き算する場合は、
1 2 3 4 5 6 7 8 9 |
// 翌日を取得 $date = new DateTime(); $date->modify("1 day"); echo $date->format('Y/m/d'); // 前日を取得 $date = new DateTime(); $date->modify("-1 day"); echo $date->format('Y/m/d'); |
日付を指定し、指定した日付からの足し算引き算を行う場合は、new するときに日付を指定するだけです。
1 2 3 4 5 6 7 8 9 |
// 翌日を取得 $date = new DateTime('2018/7/5'); $date->modify("1 day"); echo $date->format('Y/m/d'); // 前日を取得 $date = new DateTime('2018/7/5'); $date->modify("-1 day"); echo $date->format('Y/m/d'); |
“1 day” の部分を “30 day” にすれば30日後になります。
“1 day” の部分を “-90 day” にすれば30日前になります。
週を足し算引き算する方法
週の場合は、日のときの “1 day” の部分を “1 week” と書きます。
現在から1週間前、1週間後を取得するには以下のように書きます。
1 2 |
echo date("Y/m/d", strtotime("1 week")); echo date("Y/m/d", strtotime("-1 week")); |
日付を指定して1週間前、1週間後を取得するには以下のように書きます。
1 2 |
echo date("Y/m/d", strtotime("2018-06-18 1 week")); echo date("Y/m/d", strtotime("2018-06-18 -1 week")); |
DateTimeクラスを使って現在の日付から週の足し算引き算する場合は、
1 2 3 4 5 6 7 8 9 |
// 翌月を取得 $date = new DateTime(); $date->modify("1 week"); echo $date->format('Y/m/d'); // 前月を取得 $date = new DateTime(); $date->modify("-1 week"); echo $date->format('Y/m/d'); |
日付を指定する場合は、
1 2 3 4 5 6 7 8 9 |
// 翌月を取得 $date = new DateTime("2018/6/18"); $date->modify("1 week"); echo $date->format('Y/m/d'); // 前月を取得 $date = new DateTime("2018/6/18"); $date->modify("-1 week"); echo $date->format('Y/m/d'); |
と書きます。
月を足し算引き算する方法
月の場合は、日のときの “1 day” の部分を “1 month” と書きます。
現在から1ヶ月前、1ヵ月後を取得するには以下のように書きます。
1 2 |
echo date("Y/m/d", strtotime("1 month")); echo date("Y/m/d", strtotime("-1 month")); |
日付を指定して1ヶ月前、1ヵ月後を取得するには以下のように書きます。
1 2 |
echo date("Y/m/d", strtotime("2018-06-18 1 month")); echo date("Y/m/d", strtotime("2018-06-18 -1 month")); |
DateTimeクラスを使って現在の日付から月の足し算引き算する場合は、
1 2 3 4 5 6 7 8 9 |
// 翌月を取得 $date = new DateTime(); $date->modify("1 month"); echo $date->format('Y/m/d'); // 前月を取得 $date = new DateTime(); $date->modify("-1 month"); echo $date->format('Y/m/d'); |
日付を指定する場合は、
1 2 3 4 5 6 7 8 9 |
// 翌月を取得 $date = new DateTime("2018/6/18"); $date->modify("1 month"); echo $date->format('Y/m/d'); // 前月を取得 $date = new DateTime("2018/6/18"); $date->modify("-1 month"); echo $date->format('Y/m/d'); |
と書きます。
年を足し算引き算する方法
年の場合は、日のときの “1 day” の部分を “1 year” と書きます。
現在から1年前、1年後を取得するには以下のように書きます。
1 2 |
echo date("Y/m/d", strtotime("1 year")); echo date("Y/m/d", strtotime("-1 year")); |
日付を指定して1年前、1年後を取得するには以下のように書きます。
1 2 |
echo date("Y/m/d", strtotime("2018-06-18 1 year")); echo date("Y/m/d", strtotime("2018-06-18 -1 year")); |
DateTimeクラスを使って現在の日付から年の足し算引き算する場合は、
1 2 3 4 5 6 7 8 9 |
// 翌月を取得 $date = new DateTime(); $date->modify("1 year"); echo $date->format('Y/m/d'); // 前月を取得 $date = new DateTime(); $date->modify("-1 year"); echo $date->format('Y/m/d'); |
日付を指定する場合は、
1 2 3 4 5 6 7 8 9 |
// 翌月を取得 $date = new DateTime("2018/6/18"); $date->modify("1 year"); echo $date->format('Y/m/d'); // 前月を取得 $date = new DateTime("2018/6/18"); $date->modify("-1 year"); echo $date->format('Y/m/d'); |
と書きます。
日付の比較
日付の比較は注意が必要です。
フォーマットが異なると同じ日付でも別物になってしまいます。
1 2 3 4 5 6 7 8 9 10 11 |
$date = new DateTime("2018/6/18"); $date1 = $date->format('Y-m-d'); $date = new DateTime("2018/6/18"); $date2 = $date->format('Y/m/d'); if ($date1 === $date2) { echo "同じ"; } else { echo "違う"; } |
日付の比較には、strtotime() を使ってUNIXタイムスタンプを取得します。
UNIXタイムスタンプとは、1970年1月1日 0時0分0秒を基準にして、基準からの経過を秒で返してくれます。
1 2 3 4 5 6 7 8 9 10 11 |
$date = new DateTime("2018/6/18"); $date1 = $date->format('Y-m-d'); $date = new DateTime("2018/6/18"); $date2 = $date->format('Y/m/d'); if (strtotime($date1) === strtotime($date2)) { echo "同じ"; } else { echo "違う"; } |
こう書けばちゃんと比較できます。
○○ヵ月後という仕様は注意
よく「有効期間が3ヶ月」のような仕様があります。
2018/6/18 だったら 2018/9/18 が3ヵ月後で問題ないですが、2018/1/31 の1ヵ月後はいつになりますか?
2018/2/28 ですか?単純に30日後だったら 2018/3/2 ですか?
1ヶ月は28日,30日,31日の月があります。つまり29日~31日の○○ヵ月後というのは注意が必要です。
ここはお客さんとの話し合いで解決するしかありません。
- 日付が存在しない場合は一律月末に合わせる。1/31の1ヵ月後は2/28とする。2/28の1ヵ月後は3/28とする。
- 1ヶ月としないで30日とし、1/31の30日後は3/2とする。
のような解決策が一般的です。
祝日は変わる
翌営業日を取得する場合など土曜や日曜、祝日が影響される場合があります。
日曜に祝日が被った場合は翌日の月曜は振り替え休日になりますが、土曜が祝日のときにはなりません。
そもそも祝日は変更されることがよくあります。
PHPの標準機能では祝日を取得することは出来ません。
祝日は国によって定義が変わりますし、前述したように追加されたり無くなったりします。
祝日を定義されたクラスなどがネット上にたくさん転がっていますが、それにしても祝日が変更になったら修正が必要になります。
僕はDBに祝日を定義するテーブルを設置して、管理システム上で祝日を登録できるようにして、それを操作できるクラスを自前で作成しています。
1個作るまでは何日が祝日とか第2○曜日が・・・とか面倒でしたが一度作ってしまえば後はかなり楽になります。
でも平成の次には対応していないのでまた祝日を使う案件が来たときにでも修正が必要ですね・・・
まとめ
日付の計算はややこしいですが、上記のコードさえメモしておけばあとはコピペでいけます。
比較をするときには strtotime() を使いUNIXタイムスタンプを取得して比較します。
あとは仕様を気をつけてシステム設計をしてください。
コメントを残す