日付と時刻

日付と時刻

現在の日時を取得する

getdate()関数を使用することによって、現在の日時を取得することができます。

    

現在の日時を取得

    <?php
        $today = getdate();
        echo $today["year"]."/".$today["mon"]."/".$today["mday"];
    ?>
    

実行結果

2008/1/21

上記のスクリプトでは、getdate()関数を使用し、現在の日付を連想配列から、年、月、日を表示しています。

getdate()関数の配列を定義するパラメータ

パラメータ 意味
second 現在の秒
mimutes 現在の分
hours 現在の時
mday 現在の月次の日付
wday 現在の曜日番号
mon 現在の月
year 現在の年
yday その年の通算日
weekday 現在の曜日の文字列
month 現在の月の文字列

日付をフォーマットする

date()関数は、日付/時刻を指定されたフォーマットの文字列に変換します。

日付/時刻をフォーマット

    <?php
        $str1 = date("Y/m/d");
        echo "$str1<br />¥n";

        $str2 = date("Y/m/d H:i:s a");
        echo "$str2<br />¥n";

        $str3 = date("y/n/j G:i:s");
        echo "$str3<br />¥n";

        $str4 = date("Y F 1");
        echo "$str4<br />¥n";
    ?>
    

実行結果

2008/01/21
2008/01/21 12:04:45 pm
08/1/21 12:04:45
2008 January 1

date()関数のフォーマット文字

フォーマット文字 意味
a amまたはpm
A AMまたはPM
d 2桁の日付
D 3文字の曜日 (Sun~Sat)
F フルスペルの英字で月を表示
h 12時間単位(00~12)
H 24時間単位(00~23)
g 先頭に0をつけない12時間単位(0~12)
G 先頭に0をつけない24時間単位(0~23)
i 2桁の分(00~59)
j 先頭に0をつけない(0~31)
l フルスペルの英字で曜日を表示
L 閏年では1を、それ以外は0を返す
n 先頭に0をつけない(0~12)
m 2桁の月(01~12)
M 3文字の月(Jan~Dec)
s 2桁の秒(00~59)
S 英文の序数を意味する接尾語(th~nd)
t 指定した月の日数(28~31)
U UNIX時間(1970年1月1日からの秒数)
w 数値で示す曜日(0~6)
y 西暦の下2桁を表示
Y 西暦を4桁で表示
z その年の1月1日からの通算日(0~365)を表示
Z タイムゾーンのオフセット秒

日付関数の応用

日付同士の時間差を計算

会員情報などを登録した日時や更新した日時の差を計算する時などには、mktime()関数を使用することで求めることができます。また、このmktime()関数は各日時をUNIX時間 (1970年1月1日0時からの経過秒数)に変換し、時差を求めます。

時差を計算

    <?php
        $regist1 = "05/12/2006";
        $regist2 = "10/05/2007";

        list($month1,$day1,$year1) = explode("/",$regist1);
        list($month2,$day2,$year2) = explode("/",$regist2);

        $regist1 = mktime(0,0,0,$month1,$day1,$year1);
        $regist2 = mktime(0,0,0,$month2,$day2,$year2);

        $time_difference = $regist2-$regist1;

        echo ("時差は");
        echo date("Y",$time_difference) - 1970;
        echo ("年と");
        echo date("m",$time_difference) - 1;
        echo ("ヶ月");
        echo date("d",$time_difference) - 1;
        echo ("日です");
    ?>
    

実行結果

時差は1年と4ヶ月26日です

上記のスクリプトでは、変数$regist1と$regist2をexplode()関数で分割して、mktime()関数でUNIX時間にへの変換を行っています。その変換を行って、時差を計算し、date()関数で文字をフォーマットしています。ここでlist()関数は配列と同様の形式で、複数の変数への代入($month1,$day1,$year1など)を行っています。

日付の正当性をチェック

入力フォームから入力された日付が正しい値であるかなど、checkdate()関数を使ってチェックをすることができます。

checkdate()関数のチェック基準

  • 年が1から32767の間。
  • 月が1から12の間。
  • dayが指定された月 (month)の日数以内。うるう年 (year)も対象となる。
    <?php
        $check_date = "2008/15/01";

        list($year,$month,$day) = explode("/",$check_date);

        if(checkdate($year,$month,$day)) {
            echo "この日付は正しいです。";
        } else {
            echo "この日付は正しくありません。";
        }
    ?>
    

実行結果

この日付は正しくありません。

上記のスクリプトは年月日をexplode()関数で分割して、checkdate()関数で日付の正当性をチェックしています。実行結果は、「月が1から12の間。」の基準から見て、おかしいので、「この日付は正しくありません。」となります(15月などという月は存在しないので)。

セレクトメニューを生成

ここではスクリプトでセレクトメニューを作成してみます。

通常htmlでセレクトメニューを記述した場合は下記のようになります。

    <select name="year">
        <option value="01">1</option>
        <option value="02">2</option>
        <option value="03">3</option>
        <option value="04">4</option>
        <option value="05">5</option>
        <option value="06">6</option>
        <option value="07">7</option>
        <option value="08">8</option>
        <option value="09">9</option>
        <option value="10">10</option>
        <option value="11">11</option>
        <option value="12">12</option>
    </select>年
    

月の場合は上記の12個分のoptionタグで済みますが、日の場合などは最多で31個も記述しなくてはなりません。phpで記述した場合は以下の用になります。

    <select witdh="50" name="year">
    <?php
        $day =1;
        for ($i=0; $i<31; $i++) {
            $day_two_digits = sprintf("%02d",$day);
            echo("<option value='$year_two_digits'>$day</option>\n");
            $day++;
        }
    ?>
    </select>日
    

実行結果

スクリプトでのselectメニュー

上記のスクリプトでは、for文の「($i=0; $i<31; $i++)」で31回目までループを繰り返しています。ループを処理がなされている間、{}内の処理が走っています。「%02d」の「d」は引数を整数として扱い、10進数として表現します。「$day++;」では、ループ処理が繰り返されるたびに1が足されていきます。結果31まで数字が出現します。そして、その1~31までの数字が「echo("<option value='$year_two_digits'>$day</option>\n");」の$dayに入り、セレクトメニューの日となります。