はじめに
ついに、PHPのお勉強も本格的に始めちゃいました。
ささっと学びたかったので、成果物の制作と同時に文法も学習していくスタイルです(笑)
ということで、今回挑戦したのは、「カレンダー」の制作です。
カレンダーの制作を通して、「日付」に関するPHPの文法を学んでみたので、備忘録としてこちらに残そうと思います。
タイムゾーンの設定
はじめにタイムゾーンを設定しておかないと、日付や時刻の表示が狂います!
日本の日付・時刻を表示するとして、
date_default_timezone_set('Asia/Tokyo');
上記のように、timezoneを'Asia/Tokyo'にsetすることで、日付・日時を日本のものに設定することができます。
今の年と月を求めてみる
それでは、今の年と月を求めてみましょう。
$year = date('Y'); // 年
$month = date('m'); // 月
上記のように、dateメソッドを使うことで、求められます。
引数の、Yは、YearのYなので、「年」が求められ、mは、monthのmなので、「月」が求められます。
他にも、
d -> 日(01〜31)
L -> 閏年かどうか
t -> 月の日数
などを求めることが可能です。
PHPには多くの、日付や日時に関する記述子があります。
また、記述子を使う際に気を付けることは、記述子を文字列として渡すことです!!
クウォーテーションを忘れないようにしましょう!!
eg.Y -> date('Y')
月末の日にちは何日??
お次に、今月末の日にちを求めていきます。
先ほど、月の日数を求める記述子、tを紹介しました。これを使って求めます。
->月の最終日は、月の日数の値
$endOfThisMonth = date('t');
echo $endOfThisMonth.'<br />'; // 30
引数に指定した月の日数を、変数$endOfThisMonthに格納していきます。
dateメソッドと日数を求めるtを使っていることがわかります。
たったこれだけで、今月は何日あるのかを知ることができます!
曜日って取得できるの??
曜日も取得可能です。同じく、dateメソッドを使うのですが、記述子が先ほどとは異なります。
今回は、wを使います。
記述子wは、曜日を0〜6の数値で返してくれます。
0 -> 日
1 -> 月
2 -> 火
3 -> 水
4 -> 木
5 -> 金
6 -> 土
今月最初の1日の曜日は、どれだったのか、調べてみましょう!
$firstDay = date('w', strtotime($year.$month.'01'));
echo $firstDay.'<br />'; // 2(2020年9月01日の場合)
dateメソッドに曜日を求める記述子w、strtotimeでタイムスタンプを用いて求めていることがわかります。
しかし、引数には見慣れないメソッド、strtotimeが入っています。
以下、公式による説明を引用しております。
strtotime
(PHP 4, PHP 5, PHP 7)strtotime — 英文形式の日付を Unix タイムスタンプに変換する
説明 ¶
strtotime ( string $datetime [, int $now = time() ] ) : int
この関数は英語の書式での日付を含む文字列が指定されることを期待しており、 now で与えられたその形式から Unix タイムスタンプ (1970 年 1 月 1 日 00:00:00 UTC からの経過秒数) への変換を試みます。 now が指定されていない場合は現在日時に変換します。
このように、strtotimeを使うことで、文字列形式だった日付をコンピュータが扱うことができるUnixタイムスタンプという数字の羅列に変えて操作するためのメソッドなんですね。
おそらく、メソッド名の由来も、
str -> string(文字列)
to -> to
time -> timestamp
「文字列からタイムスタンプへ」なのではないかと推測しました(笑)
話が少しそれましたが、strtotimeメソッドの引数に、先ほど求めた、年と月、月初の1日を表す01を渡すことで、現在の月の1日目の曜日を求めることができます。
まとめ
このように、PHPでは簡単に日数を求めることができたりします!
また、記述子によっては、曜日も0〜6の数字ではなく、文字列で返してくれるものがあったりもするので、dateメソッドを使って日付を扱うととても便利だなーと感じました。
ささっとまとめちゃいましたが、読んでくださりありがとうございます!
時間があれば、記述子についても一覧でまとめてみたいですね。
理解不足等による間違いなどありましたら、コメント頂きたいです。