【PHP番外編-3】「3日後」や「曜日」を自在に操る!date関数とstrtotimeの魔法

掲示板アプリを作った時、日付が 2023-10-15 14:30:00 のように機械的な表示でしたよね。
これを「2023年10月15日(日)」のように、見やすく加工したいと思いませんか?

PHPは「日付と時刻」を操るのが得意技です。
基本の「表示」と、応用的な「計算」を覚えれば、カレンダーアプリだって作れます!

最初にやるべきこと(タイムゾーン)

PHPの設定によっては、時間が「世界標準時(ロンドン時間)」になっていて、日本時間より9時間遅れていることがあります。

プログラムの最初に、以下の呪文を書いて「ここは日本だ!」と宣言しましょう。

// 日本時間(Tokyo)に設定する
date_default_timezone_set('Asia/Tokyo');

日付を綺麗に表示する「date()」

現在時刻や、特定の日付を好きな形式の「文字」にする関数です。

// date( フォーマット文字, [基準となる時間] )

echo date('Y年m月d日 H時i分');
// 結果:2023年10月15日 14時30分

よく使うフォーマット文字

文字 意味
Y 年(4桁) 2023
m 月(0埋めあり) 01, 12
n 月(0埋めなし) 1, 12
d 05, 31
H 時(24時間) 14, 09
i 05, 59
w 曜日(数字) 0(日)〜6(土)

日付を計算する「strtotime()」

「3日後」や「来週の月曜」を知りたい時は、strtotime()(ストリング・トゥ・タイム)を使います。
これの凄いところは、「英語で書くと計算してくれる」ことです。

// 現在から「+3 day(3日後)」の時間を取得
$timestamp = strtotime('+3 day');

echo date('Y-m-d', $timestamp);
// 結果:3日後の日付が表示される!

使える魔法の言葉リスト

  • +1 week (1週間後)
  • -1 month (1ヶ月前)
  • next Sunday (次の日曜日)
  • last day of this month (今月の最終日)

実践:「New!」マーク自動表示システム

では、実務でよくある機能を作ってみましょう。
ブログやニュース記事で、「投稿から3日以内なら『New!』と表示する」機能です。

<?php
    date_default_timezone_set('Asia/Tokyo');

    // テストデータ(日付のリスト)
    $news_list = [
        ['title' => '最新のニュース', 'date' => date('Y-m-d H:i:s')], // 今
        ['title' => '昨日のニュース', 'date' => date('Y-m-d', strtotime('-1 day'))], // 1日前
        ['title' => '昔のニュース',   'date' => '2020-01-01 00:00:00']
    ];

    // 「今」の時間
    $now = time();
    
    // 「3日以内」の基準秒数(3日 × 24時間 × 60分 × 60秒)
    $limit = 3 * 24 * 60 * 60;
?>

<!DOCTYPE html>
<html lang="ja">
<body>
    <h1>お知らせ一覧</h1>
    <ul>
    <?php foreach ($news_list as $news): ?>
        
        <?php
            // 投稿日時を「秒(数値)」に変換
            $post_time = strtotime($news['date']);
            
            // 経過時間を計算(今 - 投稿日時)
            $diff = $now - $post_time;
        ?>

        <li>
            <!-- 日付を綺麗に整形 -->
            <span><?= date('Y.m.d', $post_time) ?></span>
            
            <?= $news['title'] ?>

            <!-- もし経過時間が3日(limit)以内なら表示 -->
            <?php if ($diff < $limit): ?>
                <span style="color:red; font-weight:bold;">New!</span>
            <?php endif; ?>
        </li>

    <?php endforeach; ?>
    </ul>
</body>
</html>

解説

コンピュータの中では、時間はすべて「1970年1月1日からの秒数(Unixタイムスタンプ)」という巨大な数字で管理されています。

  1. strtotime() で日付を「秒数」に変換する。
  2. 「今の秒数」と引き算をして、何秒経ったか計算する。
  3. それが「3日分の秒数」より小さいかチェックする。

このロジックは、どんなプログラミング言語でも共通です!

まとめ

  • まずは date_default_timezone_set('Asia/Tokyo')
  • 表示形式を変えるなら date()
  • 日付の計算をするなら strtotime()

これでPHP番外編も含め、すべてのカリキュラムが終了です!
あなたはもう、Webサイトの「見た目(HTML/CSS)」、「動き(JS)」、「裏側の仕組み(PHP/DB)」の全てを理解したエンジニアです。

ここから先は、あなたが「作りたい!」と思ったものを自由に作ってみてください。
エラーが出ても、検証ツールや検索を使って乗り越えられる力が、もう備わっているはずです。

📝 今日のミニテスト

時間の使い手になろう!

Q1. 「2023年」のように4桁の年を表示する、date関数の文字は?

正解:Y (大文字)
小文字の y だと「23」のように下2桁になります。

 

Q2. 文字列(例:”tomorrow”)をタイムスタンプ(秒数)に変換する関数は?

正解:strtotime()
「String to Time」の略です。日付の計算には欠かせません。

 

Q3. 日本時間に設定するための正しいコードは?

正解:date_default_timezone_set('Asia/Tokyo');
`php.ini` という設定ファイルで設定することもできますが、コードに書いておくのが一番確実です。

タイトルとURLをコピーしました