PHPプログラミング

最終更新日:
公開日:

レシピ

日付・時間の扱い

タイムスタンプから日時を計算する

時間の取得で便利なタイプスタンプ。今回はこのタイムスタンプを使った日時の計算方法を解説します。

この記事のポイント

  • タイムスタンプを使った時間の計算方法が分かる
  • 任意の単位で過去や未来の時間を計算できる
  • 2つの時刻から時差を取得する

目次

タイムスタンプを使った日時の計算

「xx時間後の時間を取得する」など、時刻の計算を使う機会は多いです。
そこで今回は、タイムスタンプを使った時刻の計算方法を解説します。

  • タイムスタンプについて知る
  • 「秒」で計算する
  • 「分」で計算する
  • 「時間」で計算する
  • 「年」で計算する
  • ある時点から、どれぐらいの時間が経過したかを計算する

タイムスタンプはtime関数から取得したものを使います。

タイムスタンプについて知る

time関数などから取得することのできる「タイムスタンプ」は、UNIX時間を指します。
具体的には、協定世界時(UTC)である1970年01月01日 00時00分00秒を起点として、そこから経過した「秒数」になります。

つまり、タイムスタンプを使えば自分が生まれてから経過した秒数や、ある開始時刻と終了時刻の間に経過した秒数を簡単に計算することができます。

1970年01月01日が起点となっているので、引き算をすることでそれよりも以前の日付を計算することも可能です。

  • 0 – 1970-01-01 00:00:00
  • 10000 – 1970-01-01 02:46:40
  • 100000000 – 1973-03-03 09:46:40
  • 10000000000 – 2286-11-20 17:46:40
  • -1000000000 – 1938-04-24 22:13:20

「秒」で計算する

現在を起点に、30秒後の時間、30秒前の時間をそれぞれ取得していきます。
ここでは仮に、「2017年08月01日 00:00:00」を起点とします。

コード例

<?php
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');

// タイムスタンプを取得
$timestamp = time();

echo date("Y-m-d H:i:s", $timestamp); // 2017-08-01 00:00:00

// 30秒後の時刻
echo date("Y-m-d H:i:s", $timestamp+30); // 2017-08-01 00:00:30

// 30秒前の時刻
echo date("Y-m-d H:i:s", $timestamp-30); // 2017-07-31 23:59:30

計算は単純に$timestampから「30」を足し引きしているだけになります。
タイムスタンプの元々の単位が「秒」のため、秒のみの計算であれば非常にシンプルです。

また、time関数strtotime関数で取得できるタイムスタンプはint型であるため、そのまま整数による演算が可能です。

「分」で計算する

続いて、「分」の単位での計算をしてみます。
1分は60秒なので、例えば30分前と30分後の時間を取得したい場合は次のようになります。

コード例

<?php
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');

// タイムスタンプを取得
$timestamp = time();

echo date("Y-m-d H:i:s", $timestamp); // 2017-08-01 00:00:00

// 30分前の時刻
echo date("Y-m-d H:i:s", $timestamp-(60*30)); // 2017-07-31 23:30:00

// 30分後の時刻
echo date("Y-m-d H:i:s", $timestamp+(60*30)); // 2017-08-01 00:30:00

60*30」で「分」を「秒」に換算します。
もし45分であれば「60*45」、90分であれば「60*90」のようになり、タイムスタンプからこの数字を足し引きすることで時間の計算を行います。

「時間」で計算する

「時間」の単位での計算をします。
1時間は60分なので、3時間前と3時間後の時間を取得したい場合は次のようになります。

コード例

<?php
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');

// タイムスタンプを取得
$timestamp = time();

echo date("Y-m-d H:i:s", $timestamp); // 2017-08-01 00:00:00

// 3時間前の時刻
echo date("Y-m-d H:i:s", $timestamp-(60*60*3)); // 2017-07-31 21:00:00

// 3時間後の時刻
echo date("Y-m-d H:i:s", $timestamp+(60*60*3)); // 2017-08-01 03:00:00

60*60*3」で「3時間」を「秒」に換算します。
もし5時間であれば「60*60*5」、12時間であれば「60*60*12」のようになります。

「年」で計算する

続いて、「年」の単位で計算をします。
1年を秒に換算するには、「60*60*24*365」という式を使います。

3年前の日時と、3年後の日時を取得してみましょう。

コード例

<?php
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');

// タイムスタンプを取得
$timestamp = time();

echo date("Y-m-d H:i:s", $timestamp); // 2017-08-01 00:00:00

// 3年前の時刻
echo date("Y-m-d H:i:s", $timestamp-(60*60*24*365*3)); // 2014-08-02 00:00:00

// 3年後の時刻
echo date("Y-m-d H:i:s", $timestamp+(60*60*24*365*3)); // 2020-07-31 00:00:00

60秒 × 60分 × 24時間 × 365日」で「3年」という時間を「秒」に換算しています。
前後ともに日付が1日ずつずれていますが、それは閏年があるためです。

ある時点から、どれぐらいの時間が経過したかを計算する

タイムスタンプは整数型の「秒」なので、2つのタイムスタンプを引き算をして差を求めることで、2つの時刻の間にどれぐらいの時間が経過しているかを調べることができます。

例えば、8月10日の13時00分〜15時30分の間に経過した秒数を計算したい場合は、次のようになります。

コード例

<?php
// 2つの時刻のタイムスタンプを取得
$timestamp = strtotime('2017-08-10 13:00:00');
$timestamp2 = strtotime('2017-08-10 15:30:00');

echo $diff/60; // 150(分)

続いて、8月3日10時00分〜9月1日14時00分の間に経過した時間を計算してみます。

コード例

<?php
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');

// 2つの時刻のタイムスタンプを取得
$timestamp = strtotime('2017-08-03 10:00:00');
$timestamp2 = strtotime('2017-09-01 14:00:00');

echo $diff/(60*60*24); // 29.166666666667(約29日)

このように2つの時刻の差を計算することは、「30日の無料体験期間」や「1ヶ月ごとに決済する」といったシステムを実装する際にも活用することができます。
その月の日数や閏年にも左右されずに「30日が経過したかどうか」のような判断ができるため、例え個々のデータの登録日がバラバラであったとしても、平等に一定時間の経過に伴った処理の実行が可能です。

こちらの記事は役に立ちましたか?

ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。

コメントありがとうございます!
運営の参考にさせていただきます。