(PHP) 日付関数(date, strtotime)の使い方

(PHP) 日付関数(date, strtotime)の使い方

 

本記事では、
phpの日付処理で使用するdate関数と、strtotime関数の使い方を解説する。

両者はphpの日付処理では合わせて使用することも多く、非常に使用頻度の高いものとなるので、しっかりと使い方をマスターしたほうが良い関数のうちの一つだろう。

 

タイムゾーンの設定

date関数strtotime関数を使う前に、
最初に必ずタイムゾーンの設定を行う。

PHPで日付関数を利用するにあたって、最初にタイムゾーンの設定を行う必要がある。
設定は、PHPに以下の記述を追記する。

date_default_timezone_set('Asia/Tokyo');

 

日付関数を使用する前に設定されている必要があるので、
記述は冒頭あたりにしておくと良い
だろう。

タイムゾーン設定とは

タイムゾーン設定とは、日付をどこの国の時間として扱うのか明示することだ。

このページを見ているということはおそらく日本人向けのサイトだと思われるので、
タイムゾーンは東京都を基準に設定する。

 

 

date関数の使い方

date関数は、
タイムスタンプを日付文字列で返すことが出来る関数だ。

date(日付文字列)

date(日付文字列, タイムスタンプ)

 

  • 引数1つの時:「現在の時刻」を「日付文字列」で出力
  • 引数2つの時:「第2引数のタイムスタンプ」を「日付文字列」で出力

 

日付文字列は、指定したタイムスタンプの日時から取得したい日付の情報を書き込むものだ。時間や日時にアルファベットが割り振られており、例えば以下のように日時を指定して取得することが可能だ。

echo date('Y年m月d日 H時i分s秒');

//実行結果
2022年05月03日 18時37分05秒

 

上記のように第一引数のみ指定した場合は、現在の日時を出力するが、
下記のように第二引数(タイムスタンプ)まで指定した場合は、指定したタイムスタンプの日時を出力する

echo date('Y年m月d日 H時i分s秒', '1651574236');

//実行結果
2022年05月03日 19時37分16秒

 

使用できる日付文字列一覧

日付文字列に使うアルファベットの対応表は以下のようになる。

種類 説明 現時刻の例
Y 年。4桁の数字。 2022
y 年。2桁の数字。 22
F 月。フルスペル。 May
M 月。3 文字形式。 May
m 月。二桁の数字。1月~9月は先頭に0が付く。 05
n 月。数字で先頭に0をつけない。 5
d 日。二桁の数字。1日~9日の場合は先頭に0が付く。 03
j 日。先頭に0を付けない。 3
t 日。該当月の月末日を取得する。28~31。 31
曜日 D 曜日。3文字のテキスト。 Tue
l 曜日。フルスペル。 Tuesday
w 曜日。日曜(0)~土曜(6)。 2
時間 a am/pm。午前/午後を表す。 pm
A AM/PM。午前/午後を表す。 PM
g 時。12時間単位で先頭に0を付けない。 6
G 時。24時間単位で先頭に0を付けない。 18
h 時。12時間単位で必ず2桁。 06
H 時。24時間単位で必ず2桁。 18
i 分。先頭に0を付ける。 37
s 秒。先頭に0を付ける。 05

 

第二引数で指定した日時を表示してくれるのは大変便利なのだが、
ではこの指定日時のタイムスタンプは一体どうやって取得すればよいのだろうか?

それは、次で紹介するstrtotime関数を使って取得する。

 




 

strtotime関数の使い方

strtotime関数は、
date関数とは逆に、「日付文字列をタイムスタンプに変換する」ことが出来る関数だ。

 

タイムスタンプとは

タイムスタンプとは、 1970年1月1日0時0分から数えた通算の秒数のことだ。

例えば、本記事執筆時点での現在時刻は「1651574236」であり、
これは1970年1月1日0時0分から数えた秒数ということになる。

タイムスタンプはtime()関数を使用することで、自動的に現在時刻のタイムスタンプを取得できる。

echo time();

// 実行結果
1651574236

 

strtotime関数の書式は以下だ

strtotime(日付文字列)
strtotime(日付文字列, タイムスタンプ)

 

使い方は大きく分けて3種類あるので、それぞれ個別に説明する。

 

①日付文字列をタイムスタンプに変換する

strtotimeは、
文字列で構成された日付フォーマットを、タイムスタンプの数字列に変換することができる。

例えば、2022年1月1日0時0分0秒のタイムスタンプを知りたい場合は、
strtotimeの引数に以下のような日付文字列を入れることで取得することができる。

echo strtotime("2022-01-01 00:00:00");

//実行結果
1640995200

ただし、strtotimeの日付文字列は、
「解釈できるフォーマット」と「解釈できないフォーマット」が存在するので、注意が必要である。

//解釈できるフォーマット
echo strtotime("2022-05-01");
echo strtotime("20220501");
echo strtotime("20220501000000");
echo strtotime("2022/05/01 00:00:00");
//解釈できないフォーマット
//ドットは不可
echo strtotime("2022.05.01");
//日本語も不可
echo strtotime("2022年05月01");

 

解釈できるフォーマットのうちどれか一個を使い回すようにしておけば、
人為的なミスも起こりにくいと思うので、どれか一つに決めて使い回すのをお勧めする。

 

dateとstrtotimeは併せて使う

strtotimeによって日付文字列さえ取得できればタイムスタンプ化が出来るので、
date関数の第二引数(タイムスタンプ)にstrtotime関数を使用すると言うことをよくやると言うことは絶対に覚えておこう。

echo date('Y年m月d日 H時i分s秒', strtotime('2019-05-01 00:00:00'));

//実行結果
2019年05月01日 00時00分00秒

 

②現在時刻からの相対日時をタイムスタンプに変換する

strtotimeでは、
現在時刻からの相対的な日時のタイムスタンプを取得することが可能だ。

その場合、第一引数に取得したい相対日時の「英文」を記入する。

echo strtotime("now");//現在
echo strtotime("+1 day"); //1日後
echo strtotime("-10 day"); //10日前
echo strtotime("2 week"); //2週間後
echo strtotime("3 week 4 day 5 hours 10 second"); //3週間+4日+5か月+10秒後

//実行結果
1651577403
1651663803
1650713403
1652787003
1653755413

 

英文の書式は以下だ

数値 書式

「数値 単位」の形で、現在日時から相対的に取得したいタイムスタンプを指定する。

  • スペース区切りでより細かい組み合わせも可能となっている。
  • 数値の前にマイナスを符号を付けると、〇日前、〇時間前など前の日時を取得することも可能。

 

使用できる単位の種類や組み合わせは他にも大量にあるが、
以下の使用できる英文を押さえておけば大概は問題ないだろう。

年 :year
月 :month
週 :week
日 :day
時 :hour
分 :minまたはminute
秒 :secまたはsecond

 

③タイムスタンプで選択した日時の相対日時をタイムスタンプに変換する

指定日時のタイムスタンプを第二引数に設定することで、
指定日時からの相対日時を取得することも可能だ。

//2022年3月4日から、5日と8時間後のタイムスタンプを取得
$time = strtotime("5 day 8 hour", strtotime('2022-03-04'));
echo date('Y年m月d日 H時i分s秒', $time);

//実行結果
2022年03月09日 08時00分00秒

 

まとめ:dateとstrtotimeは併せて使える日付関数

dateとstrtotimeはそれぞれ違う関数だが、
併用して扱うことが非常に多いので使い方をしっかり覚えておこう。

 

【PHP】 trim()関数で空白を取り除く方法まとめ
(PHP) glob関数の使い方【ファイルを一覧取得する】

 

https://www.php.net/manual/ja/function.date-default-timezone-set.php

https://www.php.net/manual/ja/function.date.php

https://www.php.net/manual/ja/function.time.php

https://www.php.net/manual/ja/function.strtotime.php

 

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。