PHPの日付関数(date,strtotime)を徹底解説

PHPで汎用的に使用する日付関数、date、strtotime、timeの使い方についてまとめました。

最初にタイムゾーンの設定を行ってください

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

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

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

設定は、PHPに以下の記述を追記するだけ。

date_default_timezone_set('Asia/Tokyo');

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

date関数 – タイムスタンプを日付文字列に変換して返す

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

//現在の日時で日付文字列を取得する場合は、第二引数は省略できる(自動的に現在のタイムスタンプが入る)
date(日付文字列)
//指定した日時で日付文字列を取得する場合は、第二引数にタイムスタンプを代入する
date(日付文字列, タイムスタンプ)

日付文字列は、指定したタイムスタンプの日時から取得したい日付の情報を書き込むものです。

Yと書けば四桁の年、mと書けば2桁の月の情報が取得できる…など、取得したい時間や日時でアルファベットが割り振られています。

サンプルコード
echo date('Y年m月d日 H時i分s秒');
2024年04月26日 02時33分50秒

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

よく使う日付文字列をまとめました。

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

タイムスタンプとは?

タイムスタンプは、date関数とstrtotime関数を利用する上で必ず使用する要素なのでここで覚えてください。

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

例えば、現在時刻は「1714066430」となり、これは1970年1月1日0時0分から数えた秒数ということです。

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

サンプルコード
echo time();
1714066430

date(日付文字列)で第二引数を省略すると自動的に現在時刻が代入されますが、内部的にはdate(日付文字列, time())と処理されています。

サンプルコード
//同じ処理
echo date('Y年m月d日 H時i分s秒');
echo "<br>";
echo date('Y年m月d日 H時i分s秒', time());
2024年04月26日 02時33分50秒
2024年04月26日 02時33分50秒

第二引数で特定の日時を指定して日付文字列を取得したい場合は、事前に特定の日時のタイムスタンプが分かっている必要があります。

例えば、元号の令和が始まった2019年5月1日0時0分0秒のタイムスタンプは「1556636400」となりますので、date関数の第二引数を指定することで日付文字列を取得できます。

サンプルコード
echo date('Y年m月d日 H時i分s秒', 1556636400);
2019年05月01日 00時00分00秒

しかし、対象の日時が分かっていても、その日時のタイムスタンプまでは普通知っていません。計算するのも億劫です。

そこで活躍するのが、もう一つの日付関数、strtotimeです。

strtotime関数 – 日付文字列をタイムスタンプに変換して返す

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

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

長い英文字で覚えにくいですが、分解すると、

str(文字列) to(を) time(タイムスタンプ)に変換

という意味なので、この形で覚えていくと記憶しやすいかもしれません。

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

1.日付文字列をタイムスタンプに変換する(最重要)

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

例えば、令和が始まった2019年5月1日0時0分0秒のタイムスタンプを知りたい場合は、strtotimeの引数に日付を入れることで取得できます。

サンプルコード
echo strtotime("2019-05-01 00:00:00")."<br>";
//0時0分時点で良い場合は省略化
echo strtotime("2019-05-01")."<br>";
1556636400
1556636400

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

//解釈できる
echo strtotime("2019-05-01")."<br>";
echo strtotime("20190501")."<br>";
echo strtotime("20190501000000")."<br>";
echo strtotime("2019/05/01 00:00:00")."<br>";

//ドットは不可
echo strtotime("2019.05.01")."<br>";
//日本語も不可
echo strtotime("2019年05月01")."<br>";

strtotimeによって日付文字列さえ取得できればタイムスタンプ化が出来ますので、strtotimeとdateを併用して、「2019-05-01 00:00:00」を「2019年05月01月 00時00分00秒」と表示させる、という処理が可能になります。

よく使う処理なので覚えておきましょう。

サンプルコード
echo date('Y年m月d日 H時i分s秒', strtotime('2019-05-01 00:00:00'));
2019年05月01日 00時00分00秒

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

strtotimeに現在時刻からの相対的な日時のタイムスタンプを取得したい場合は第一引数を相対日時を指定する「英文」で書きます。

サンプルコード
echo strtotime("now")."<br>"; //現在 time()と同義
echo strtotime("+1 day")."<br>"; //1日後 +は省略化
echo strtotime("-10 day")."<br>";  //10日前
echo strtotime("2 week")."<br>";  //2週間後
echo strtotime("3 week 4 day 5 hours 10 second")."<br>"; //3週間+4日+5か月+10秒後
1714066430
1714152830
1713202430
1715276030
1716244440

「数値 単位」の形で現在日時から相対的に取得したいタイムスタンプを指定します。
スペース区切りで複数指定も出来ます。

〇日前、〇時間前など前の日時を取得したい場合は、数値の前にマイナスを符号を付ければOKです。

使用できる単位の種類や組み合わせは大量にあるのですが、以下の使用できる英文を抑えておけばとりあえず大丈夫だと思います。

year
month
week
day
hour
minまたはminute
secまたはsecond

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

引数がないstrtotimeの相対指定は現在日時からの指定でしたが、指定の日時のタイムスタンプを第二引数に設定し、相対日時を取得することもできます。

サンプルコード
//令和初日から3日と5時間後
$time = strtotime("3 day 5 hour", strtotime('2019-05-01'));
echo date('Y年m月d日 H時i分s秒', $time);
2019年05月04日 05時00分00秒

まとめ:dateとstrtotimeは相互関係にあると覚えよう

dateとstrtotimeはそれぞれ違う関数ですが、併用して扱うことが非常に多いので、役割をしっかり記憶しておきましょう。

  • date タイムスタンプ(数字)を日付(文字列)に
  • strtotime 日付(文字列)をタイムスタンプ(数字)に

dateとstrtotimeは相互関係にある、と覚えると分かりやすいです。

応用編:日付処理を自作関数で効率化してみよう

日付処理は使う機会が多く、用途に応じて関数化しておくことで作業の効率化となります。

今回は一例としてdate、strtotimeを使用した自作関数の一例をご紹介します。

YYYY-MM-DD HH:ii:ssの書式をYYYY年MM月DD日 HH時ii分:ss秒に変換する

strtotimeの項でも述べましたが、ある日付文字列を日本人向けに読みやすくする処理です。

MySQLなどのデータベース管理を行っていると、日付フォーマットとして保存する場合は「YYYY-MM-DD HH:ii:ss」の形式ほとんどです。(Wordpressもこれです)

なので、この文字列を分かりやすく変換していきましょう。

function getDateJp($str){
    $timestamp = strtotime($str);
    if(!$timestamp) return false;
    return date('Y年m月d日 H時i分s秒', $timestamp);
}

こちらの関数を実行すると、日本語でフォーマットされた日付として帰ってきます。

サンプルコード
echo getDateJp('2019-05-01 15:30:45');
2019年05月01日 15時30分45秒

日本語の曜日を取得する

date関数は、曜日に対応した数値を返す機能はあっても、月~日までの日本語曜日には対応していません。

なのでこちらも関数を用意しておくと便利です。

function getDateToWeek($str){
    $aryWeek = ['日', '月', '火', '水', '木', '金', '土', '日'];
    //PHP 5.4より古いバージョンの場合は以下の書き方を行う
    //$aryWeek = array('日', '月', '火', '水', '木', '金', '土', '日');
    
    $timestamp = strtotime($str);
    if(!$timestamp) return false;
    $week = date('w', $timestamp);
    return $aryWeek[$week];
}
サンプルコード
echo getDateToWeek('2019-09-30');

〇時間後、〇日後など現在と過去の時間差を取得する

過去の時間を見て、「〇時間前」や「〇日前」などの時間差を計算し取得することが出来ます。

TwitterやFacebookなどのSNSなどで使われている表記方法で、時間差が直感的に分かるので便利です。

function getDateTimelag($str){
    $timestamp = strtotime($str);
    if(!$timestamp) return false;
    $cal = time() - $timestamp;
    if(0 > $cal) return false;
    
    if(60 > $cal){
        //60秒未満は秒数表記
        return $cal.'秒前';
    }elseif(3600 > $cal){
        //60分未満は分数表記
        return ($cal / 60).'分前';
    }elseif(86400 > $cal){
        //24時間未満は時間数表記
        return ($cal / 3600).'時間前';
    }elseif(2764800 > $cal){
        //32日未満は日数表記
        return ($cal / 86400).'日前';
    }elseif(date('Y') == date('Y', $timestamp)){
        //32日以上かつ今年の場合は月日表示
        return date('n月j日', $timestamp);
    }else{
        //32日以上かつ今年より前の場合は年月日表示
        return date('y年n月j日', $timestamp);
    }
}
サンプルコード
echo getDateTimelag('2024-04-26 02:33:40')."<br>";
echo getDateTimelag('2024-04-26 02:13:50')."<br>";
echo getDateTimelag('2024-04-25 11:33:50')."<br>";
echo getDateTimelag('2024-04-16 02:33:50')."<br>";
echo getDateTimelag('2024-03-07 02:33:50')."<br>";
echo getDateTimelag('2023-04-26 02:33:50')."<br>";
10秒前
20分前
15時間前
10日前
3月7日
23年4月26日

カレンダー機能

日付関数を駆使することで、カレンダーを作ることが出来ます。

説明とソースコードの量が多い関係で、別記事にて紹介していますが是非こちらもご確認ください。

PHPでカレンダーを作成【サンプルコード有】

日付関数を多用した上で作る機能なので、今回の記事の復習にもなります。

PHPによるカレンダー作成の応用で、今後の祝日をまとめた一覧ページも作成しましたので、よかったら覗いてみてください。

祝日カレンダー|次の祝日・連休はいつ?


日付・時間情報は、WEBサイトにおいて重要な情報として扱うことが多いです。

それらを操作するdate,strtotimeは、WEBサービスを構築する上で切り離せない要素となるので、しっかり身に着けておきましょう。

以上、PHPの日付関数(date,strtotime)を徹底解説、でした。

PHP