PHP入門 | テキストと日付の操作 | 時間に関する主な機能
続いて日時について説明する。時間というものは、コンピューター内部と一般の世界とでは扱い方がかなり異なる。コンピューターでは、時間は「ある基準となる日時からの経過」によって表現される。
PHPで日時は「タイムスタンプ」という値で表される。これは1970年1月1日午前0時ちょうどから経過した秒数で表したものである。この整数値が、時間を表すもっとも基本的な値になる。
しかし、そのような数値は人がすぐ理解できるものではないため、それをもとに「年、月、日、時、分、秒」の値として日時を取得できる関数が用意されている。
現在のタイムスタンプを得る
$変数 = time();
まず基本となる、タイムスタンプを取得する関数である。これで現在時刻のタイムスタンプ値を取得できる。
日時の要素を配列で得る
$変数 = getdate(タイムスタンプ);
この関数は日時を扱う基本になる。引数にタイムスタンプ値を入れると、「年、月、日、時、分、秒」それぞれの値を連想配列として返す。引数を省略すると、現在時刻の値を返す。返される連想配列に含まれる主な要素は次のとおりである。
- year: 年
- mon: 月
- mday: 日
- hours: 時
- minutes: 分
- seconds: 秒
- wday: 曜日、0〜6の整数
日時の値からタイムスタンプを得る
$変数 = mktime(時, 分, 秒, 月, 日, 年);
今度は逆である。「年、月、日、時、分、秒」の数値をもとに、その時刻のタイムスタンプ値を調べる関数である。引数は6つあるが、実は必須なのは最初だけである。それ以降を省略すると、現在の日付や時刻の値が自動的に適用される。
簡単な使用例を見てみよう。
<?php
if ($_POST != null){
$num = $_POST['text1'] * 1;
$t = time() + (60 * 60 * 24 * $num);
$d = getdate($t);
$result = "今日から" . $num . "日後は、" .
$d['year'] . "年" . $d['mon'] . "月" .
$d['mday'] . "日です。";
}
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>sample page</title>
</head>
<body>
<h1>Hello PHP!</h1>
<p><?php echo $result; ?></p>
<hr>
<form method="post" action="./index.php">
<input type="text" name="text1">
<input type="submit">
</form>
<hr>
</body>
</html>
この例では、入力フィールドに日数を入力して送信すると、今日からその期間後の日付を計算して表示する。
まずtimeで現在のタイムスタンプを取得し、そこに指定した日数分の秒数(60 * 60 * 24 * 日数)を加えて、指定期間後のタイムスタンプを計算する。最後にgetdateでタイムスタンプから年月日を取得すれば完了である。途中のタイムスタンプは単なる整数として計算できるので、意外に簡単である。
日付計算を行う
日付を使った計算を行ってみよう。ここでは日付の値を入力してもらい、今日からその日まで何日あるかを調べてみる。
まず例のコードを見てみよう。
<?php
if ($_POST != null){
$str = $_POST['text1'];
$d = explode("/", $str);
$t1 = time();
$t2 = mktime(0, 0, 0, $d[1], $d[2], $d[0]);
$n = ceil(($t2 - $t1) / (60 * 60 * 24));
$result = $str . "は、今日から{$n}日後です。";
}
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=UTF-8" />
<title>sample page</title>
</head>
<body>
<h1>Hello PHP!</h1>
<p><?php echo $result; ?></p>
<hr>
<form method="post" action="./index.php">
<input type="text" name="text1">
<input type="submit">
</form>
<hr>
</body>
</html>
入力フィールドに2020/1/13のように年月日をスラッシュ(/)で区切って入力し送信すると、今日からその日までの日数を計算して表示する。
前には今日から何日後の日付を計算したが、ここでの計算の基本は「タイムスタンプに変換する」ことである。2つの日付をそれぞれタイムスタンプに変換し、その差を計算して1日の秒数で割れば日数がわかる。
$str = $_POST['text1'];
$d = explode("/", $str);
まず送信されたテキストをexplodeでスラッシュ(/)記号ごとに分解し、日付を配列にする。
$t1 = time();
$t2 = mktime(0, 0, 0, $d[1], $d[2], $d[0]);
続いて、現在の日付と、用意した配列の値による日付のタイムスタンプをそれぞれ準備する。
$n = ceil(($t2 - $t1) / (60 * 60 * 24));
2つのタイムスタンプの差を60 * 60 * 24で割ると日数が出る。ただし今回は時分秒を指定していないため、小数点以下が出ることがある。そこで小数点以下を切り上げるために、ceilという関数を使っている。これは小数点以下を切り上げた値を返す関数である。
このように、日時関係は「年、月、日、時、分、秒」の値とタイムスタンプを相互に変換する方法さえわかれば、簡単な計算などは容易に行える。