PHPで日付を取得する方法は様々ある。
それぞれ使い方が異なるため、その時々で必要な方法を選択すればいい。
このページではPHPの日付取得方法についてまとめてお伝えする。
目次
PHPでの日付取得方法
まず、PHPで現在の日付を取得するためによく使う方法をさらっと見ていこう。
1 2 3 4 5 6 7 8 |
// 現在日時をUNIXタイムスタンプを秒単位で取得する $now = time(); // 現在日時を YYYY/MM/DD hh:mm:ss の書式の文字列で取得する $now = date('Y/m/d H:i:s'); // 現在日時を DateTime クラスのインスタンスで取得する $now = new DateTime(); |
上の例のように主にtime()、date()とDateTime()この三つを利用する。これからそれぞれの使い方を詳しく説明する。
PHP日付取得、理解のために
UNIX TIMESTAMPとは
time()を紹介する前にはまず、UNIX TIMESTAMPに関して少し説明しよう。
PHPに限らず、プログラミングにおいて時間に関するデータを取り扱う場合、利用するのは、この「UNIX TIMESTAMP」だ。「UNIX時間」などとも言われる。
次のようなデータが、UNIX TIMESTAMPだ。
1449465487
これは何かというと、「協定世界時(UTC)を基準にした1970年1月1日の0時0分0秒からの経過秒数」を示している。
時間を秒数、つまり数値として表すことで、「何分、何時間、何日経過したか?」などを計算式で求めることができるというわけだ。ちなみに、上記は2015年12月7日 14時18分07秒時点のものだ。
UNIX TIMESTAMPの活用方法
例えば、次は2014年1月2日 00時00分00秒時点のUNIX TIMESTAMPだ。
1388588400
続いて、次が2014年1月3日 00時00分00秒時点のUNIX TIMESTAMPだ。
1388674800
この2つの数値の差を計算すると、次のようになる。
1388588400 - 1388674800 = 86400
このように、2つの時点のUNIX TIMESTAMPを求めて、その差がどれくらいあるかで経過時間を判断し、処理を条件分けすることができる。
time()の使用
time()でのUNIX TIMESTAMP時間取得
下記のように、time()を利用して現在のUNIX TIMESTAMP時間を取得する。
time()
1 2 3 4 5 6 7 8 |
// UNIX TIMESTAMPを[$timestamp]という変数に格納する $timestamp = time() ; // 出力する echo $timestamp ; //出力結果 1449465487 |
$_SERVER['REQUEST_TIME']
処理を要する関数ではなく、既にデータになっている$_SERVER['REQUEST_TIME']を利用することで、time()と同じ結果を得られる。こちらの方が処理が速いと言われているが、そこまで劇的な影響はないので、覚える必要はない。
コードの中で登場する可能性はあるので、一応お伝えだけしておく。
$_SERVER['REQUEST_TIME']
1 2 3 4 5 |
// $_SERVER['REQUEST_TIME']を出力する echo $_SERVER['REQUEST_TIME'] ; //出力結果 1449465487 |
date()の使用
UNIX TIMESTAMPの取得方法が分かったら、今度は日時を出力してみよう。date()を利用してその使い方を紹介する。
日時を出力する
日時を出力するには、date()という関数を利用する。第1引数にパラメータを指定すると、それらが日時形式に変換される。「いつの日時を出力するか?」というと、第2引数に指定した、UNIX TIMESTAMPが基準になる。
date ( フォーマット, UNIX TIMESTAMP)
第2引数を省略すると、現在時刻time()が基準になる。そのため、下記だけの表記を見ることも多い。
date ( フォーマット)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// UNIX TIMESTAMPを取得 $timestamp = time() ; // date()で日時を出力 echo date( "Y/m/d" , $timestamp ) ; //出力結果 2015/12/12 // 改行 echo "<br><br>" ; // 第2引数は省略できる = time()を指定したのと同じ echo date( "Y/m/d" ) ; //出力結果 2015/12/12 |
指定日時を取得する
現在ではなく、指定した日時のUNIX TIMESTAMPを取得するにはstrtotime()を使う。
strtotime()は、指定した日時のUNIX TIMESTAMPを取得するための関数だ。第1引数には、取得したい日時を指定する。第2引数には、主に相対日時で取得したい場合に基準日をUNIX TIMESTAMPで指定する。
絶対日時で指定する
strtotime()は、「絶対日時」と「相対日時」で日時を指定できる。まずは絶対日時で取得してみよう。
例えば、2014年1月1日 10時20分30秒のUNIX TIMESTAMPを取得したい場合は、次のように指定して下さい。
1 2 3 4 5 6 7 8 |
// [2014/1/1 10:20:30]のUNIX TIMESTAMPを取得 $timestamp = strtotime( '2014/1/1 10:20:30' ) ; // 出力 echo $timestamp ; //出力結果 1388539230 |
相対日時で指定する
続いて、相対日時を指定してみよう。「〜日後」「〜ヶ月後」などの日時を取得したい場合に利用する。数字と、単位の組み合わせで指定する。数字は、未来の場合は「正」で、過去の場合は「負」で指定する。
定数 |
規格 |
例 |
year |
年 |
+1 year |
month |
月 |
+1 month |
week |
週 |
+1 week |
day |
日 |
+1 day |
hour |
時間 |
+1 hour |
minute |
分 |
+1 minute |
second |
秒 |
+1 second |
相対指定の使い方は次のように使う。
1 2 3 4 5 6 7 8 |
// 現在から4日後のUNIX TIMESTAMPを取得する $timestamp = strtotime( "+4 day" ) ; // 出力 echo $timestamp ; //出力結果は2015年12月7日 14時18分07秒から、4日後のUNIX TIMESTAMPになっている。 1449811087 |
第2引数には「基準日時」をUNIX TIMESTAMPで指定することができる。例えば、今日の0時0分から4日後だったら、次のように指定する。
1 2 3 4 5 6 7 8 9 10 11 |
// 今日の0時0分のUNIX TIMESTAMP $today = strtotime( date("Y/m/d 00:00:00") ) ; // 今日の0時0分($today)から4日後のUNIX TIMESTAMPを取得する $timestamp = strtotime( "+4 day" , $today ) ; // 出力 echo $timestamp ; //出力結果は2015年12月7日の0時から4日後のUNIX TIMESTAMPだ。 1449759600 |
strtotime()を使って柔軟に日付のUNIX TIMESTAMPを取ることができる。
date関数で日付のフォーマット変更
phpで日付文字列の形式(フォーマット)を変換する場合、date関数を使用し変換する。
データベースからdatetime型の値を取得した時に時間を表示せず年月日だけ表示したい場合などがある。
下記の方法で指定の形式に日付・日時を変更できる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
//日付指定 $date = '2013-01-01 00:00:00'; //フォーマット指定 echo date('Y/m/d', strtotime($date)); //出力結果 2013/01/01 //日付指定 $date = '2013-01-01 00:00:00'; //フォーマット指定 echo date('Y年n月j日', strtotime($date)); //出力結果 2013年1月1日 |
strtotime()でUnixタイムスタンプを取得し、date()で日付のフォーマットを変更する
date()関数のフォーマット
【年】
フォーマット |
内容 |
Y |
4桁の年。例:2014 |
y |
2桁の年。例:14 |
L |
閏年。1:閏年 0:閏年ではない |
【月】
フォーマット |
内容 |
m |
ゼロ詰めの月。01~12 |
n |
ゼロなしの月。1~12 |
F |
フルスペルの月。例:January |
M |
3文字形式の月。例:Jan |
t |
月の日数。28~31 |
【日】
フォーマット |
内容 |
d |
ゼロ詰めの日。01~31 |
j |
ゼロなしの日。1~31 |
z |
年間の通算日。0~365 |
【時】
フォーマット |
内容 |
g |
12時間単位の時(ゼロなし)。1~12 |
G |
24時間単位の時(ゼロなし)。0~23 |
h |
12時間単位の時。01~12 |
H |
24時間単位の時。00~23 |
【分】
フォーマット |
内容 |
i |
分。00~59 |
【秒】
フォーマット |
内容 |
s |
秒。00~59 |
【午前・午後】
フォーマット |
内容 |
a |
午前:am 午後:pm |
A |
午前:AM 午後:PM |
【曜日】
フォーマット |
内容 |
D |
3文字形式の曜日。例:Mon |
l |
フルスペルの曜日。例:Monday |
N |
ISO-8601形式の曜日。1(月)~7(日) |
W |
曜日。0(日)~6(土) |
定数
下記の定数を利用することで、各規格に沿った形式の日時を出力することができる。
定数 |
規格 |
例 |
DATE_ATOM |
Atom |
2015-12-07T14:18:07+09:00 |
DATE_COOKIE |
HTTP Cookies |
Monday, 07-Dec-2015 14:18:07 JST |
DATE_ISO8601 |
ISO-8601 |
2015-12-07T14:18:07+0900 |
DATE_RFC822 |
RFC 822 |
Mon, 07 Dec 15 14:18:07 +0900 |
DATE_RFC850 |
RFC 850 |
Monday, 07-Dec-15 14:18:07 JST |
DATE_RFC1036 |
RFC 1036 |
Mon, 07 Dec 15 14:18:07 +0900 |
DATE_RFC1123 |
RFC 1123 |
Mon, 07 Dec 2015 14:18:07 +0900 |
DATE_RFC2822 |
RFC 2822 |
Mon, 07 Dec 2015 14:18:07 +0900 |
DATE_RFC3339 |
RFC 3339 |
2015-12-07T14:18:07+09:00 |
DATE_RSS |
RSS |
Mon, 07 Dec 2015 14:18:07 +0900 |
DATE_W3C |
WWW Consortium |
2015-12-07T14:18:07+09:00。 |
定数の使い方は下記のように使う。
1 2 3 4 5 |
// 日時をAtom規格で出力する echo date( DATE_ATOM ) ; //出力結果 2015-12-07T14:18:07+09:00 |
dateTime()の使用
PHPをお使いの方ならばdate()関数はよく使われていると思う。DateTimeは日付をオブジェクトとして扱うためのクラスで、PHP 5.2.0以降から利用可能だ。例えば次のようなコードがあったとする。
1 2 3 4 5 6 |
$date = date('Y-m-d', strtotime('+3 months')); echo $date . "\n"; //出力結果 2010-09-07 |
これをDateTimeオブジェクトに置き換えると次のようになる。
1 2 3 4 5 6 |
$dt = new DateTime('+3 months'); echo $dt->format('Y-m-d') . "\n"; //出力結果 2010-09-07 |
次に、特定の日付から3ヵ月引いた日付を出す例だ。
1 2 3 4 5 6 |
$date = date('Y-m-d', strtotime('2010-09-18 -3 months')); echo $date . "\n"; //出力結果 2010-06-18 |
DateTimeを使うと次のようになる。下の例はPHP 5.3.0以降で利用可能なDateIntervalクラスを用いた例だ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$dt = new DateTime('2010-09-18 -3 months'); echo $dt->format('Y-m-d') . "\n"; //出力結果 2010-06-18 // PHP 5.3.0以降 $dt = new DateTime('2010-09-18'); $interval = DateInterval::createFromDateString('-3 months'); echo $dt->add($interval)->format('Y-m-d') . "\n"; //出力結果 2010-06-18 |
DateTimeなら2038年問題も大丈夫だ。
1 2 3 4 5 6 7 8 9 10 11 |
$date = date('Y-m-d', strtotime('2038-04-01')); echo $date . "\n"; //出力結果 1970-01-01 $dt = new DateTime('2038-04-01'); echo $dt->format('Y-m-d') . "\n"; //出力結果 2038-04-01 |
DateTimeではDateTimeZoneクラスを用いてタイムゾーンを設定することも可能だ。DateTimeZoneはDateTimeのコンストラクタの第2引数にも指定可能だ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$dt = new DateTime(); // Asia/Tokyo echo $dt->setTimeZone(new DateTimeZone('Asia/Tokyo'))->format('Y-m-d H:i') . "\n"; //出力結果 2010-06-07 15:40 // Europe/London echo $dt->setTimeZone(new DateTimeZone('Europe/London'))->format('Y-m-d H:i') . "\n"; //出力結果 2010-06-07 07:40 |
2つのDateTimeのdiffをとることも可能だ。
1 2 3 4 5 6 |
$dt1 = new DateTime('2010-06-18'); $dt2 = new DateTime('2010-06-07'); echo $dt1->diff($dt2)->format('誕生日まであと %a 日') . "\n"; //出力結果 誕生日まであと 11 日 |
DateTime::diff()メソッドは2つのDateTimeの差分をDateIntervalオブジェクトとして返す。そのためこれはPHP 5.3.0以降から使える機能になる。
日付のイテレーションを行うDatePeriodクラスもある。次の例は6月1日から6月30日までを1日ずつループする例だ。これもPHP 5.3.0からの機能だ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$period = new DatePeriod( new DateTime('first day of 2010-06'), new DateInterval('P1D'), new DateTime('last day of 2010-06 +1 second') ); foreach ($period as $day) { echo $day->format('Y-m-d') . "\n"; } //出力結果 2010-06-01 2010-06-02 (中略) 2010-06-29 2010-06-30 |
少しだけ気を付けなければならないのが new DateTime('last day of 2010-06') とすると6月30日の日付がとれるが、時間が00:00:00のままだとイテレーションの対象にならないようだ。
そのため、+1 secondsとして1秒だけ追加してあげている。
まとめ
PHPの基本的な日付取得に関する方法を紹介したが、いかがだったろうか?
このページを確認してもらえれば、日付に関して必要なところはほとんど押さえられるはずだ。PHPプログラミングにおいて、ウェブアプリ開発、ダイナミックなサイト構築する際に日付に関する処理がよく使うので、基本的なことはしっかりとおさえておくようにどんどん実践してみてください。
コメント