date() メソッド
PHP では古くから date() メソッドを利用して日付を処理することもできます。date() の引数には決められた文字フォーマットを入力して結果を取得します。
date('フォーマット')
- date() は2038年問題で、2038年を超えると意図しない動作する可能性があります
UNIXタイムスタンプとは
UNIXタイムスタンプは、協定世界時(UTC)の規格で、1970年1月1日0時0分0秒からの経過時間を数値で表したもので、PHPでは単にタイムスタンプともいい、date() 第2引数に代入して日付指定することもできます。
date('フォーマット', タイムスタンプ)
PHPでは time() , strototime() , mktime() などで作成することができますが、のちほど説明します。
日付フォーマットを指定
日付フォーマットは「年月日」や「時間」を規定文字で指定します。
//4桁の年
date('Y');
//2桁の月
date('m');
//日
date('d');
//時
date('H');
//分
date('i');
//秒
date('s');
曜日(数値)
w で 日曜日 = 0 ではじまる曜日の数値を取得します。
date('w');
月の日数
t でその月の日数を取得します。
date('t');
現在の日時を文字列で表示する
date() で現在の日時を「年月日」「時刻」で出力してみましょう。タイムゾーンは Asia/Tokyo で設定します。
date_default_timezone_set('Asia/Tokyo');
echo date('Y年m月d日 H:i:s') . PHP_EOL;
time() で現在のタイムスタンプを取得
time() で現在のタイムスタンプを取得します。
time()
date() の第2引数には現在のタイムスタンプを代入して、日時を表示してみましょう。ちなみに time() は省略しても結果は同じです。
echo date('Y/m/d H:i:s', time());
strtotime() で文字列からタイムスタンプを取得
strtotime() は文字列からタイムスタンプを取得します。
strtotime(日時の文字列)
文字列の指定はいろいろな記述ができます。date() で表示してみましょう。
日時指定
日時を文字列で指定してタイムスタンプを作成します。もう一度、date() に戻して確認してみましょう。
$time = strtotime('2020/01/01 08:30');
echo date('Y年m月d日 H:i:s', $time);
echo PHP_EOL;
//2020年01月01日 08:30
日時の前後指定
day, month, year などの日付英単語と数字で日時の前後を指定できます。数字の前に「+」「-」の符号をつけます。
//翌日
echo date('Y/m/d H:i:s', strtotime('+1day')) . PHP_EOL;
//3ヶ月前
echo date('Y/m/d H:i:s', strtotime('-3month')) . PHP_EOL;
//1年後
echo date('Y/m/d H:i:s', strtotime('+1year')) . PHP_EOL;
//2週間前
echo date('Y/m/d H:i:s', strtotime('-2week')) . PHP_EOL;
曜日を指定
次の曜日、前の曜日を指定します。(現在の日時によって当日を含みます)
//2週間後の月曜日
echo date('Y/m/d H:i:s', strtotime('+2 Monday')) . PHP_EOL;
//前の月曜日
echo date('Y/m/d H:i:s', strtotime('-1 Monday')) . PHP_EOL;
DateTimeクラス
date() や strtotime() は日付の範囲が1900 から 2038年までになっていて、それ以外の日付を扱うとエラーになる 2038年問題 を抱えています。そこでPHPでは DateTimeクラスが用意されており date() よりも機能が充実しています。DateTimeクラスを使うには new DateTime() でインスタンスを作成します。
$date = new DateTime();
new DateTime() で作成した日付オブジェクトをもとに、format() メソッドで日付や時間、曜日などを取得できます。
//4桁の年
$date->format('Y');
//2桁の月
$date->format('m');
//日
$date->format('d');
//時
$date->format('H');
//分
$date->format('i');
//秒
$date->format('s');
曜日(数値)
日曜日 = 0 ではじまる曜日の数値を取得します。
$date->format('w');
日時の表示
format() に日時フォーマットを指定して表示してみましょう。
echo $date->format('Y/m/d H:i:s');
echo PHP_EOL;
日付・日時の前後
modify() は日時の前後を取得します。引数は strtotime() で指定した文字列と同様です。
//1日前
$date = new DateTime();
echo $date->modify('-1days')->format('Y-m-d H:i:s');
echo PHP_EOL;
//2ヶ月後
$date = new DateTime();
echo $date->modify('+2month')->format('Y-m-d H:i:s');
echo PHP_EOL;
日付の差分をとる
DateTimeクラスには差分を計算する diff() メソッドが用意されています。開始日と終了日のDateTimeインスタンスを使って比較します。
終了日インスタンス->diff(開始日インスタンス)
diff() を実行するとDateIntervalクラスのインスタンスを取得します。
開始日と終了日の差分(何日あるか)を計算してみましょう。
$start_date = new DateTime('2000/1/1');
$end_date = new DateTime();
$end_date->diff($start_date);
タイムゾーン
日付のタイムゾーン(地域)を取得します。
$timezone = $date->getTimezone();
echo $timezone->getName();
echo PHP_EOL;
結果
今日の日付・日時が表示されます。
2021-04-26 16:21:44
問題1
今日日付と曜日を表示してみましょう。
例
2021年04月27日(火)
問題2
2020年1月10日から2021年3月21日の日数を計算してください。
問題3
今月のカレンダーを一覧で作成してみましょう。
例
2021月7月
1日(木)
2日(金)
3日(土)
...