PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

PHPで指定したタイムスタンプを「10分前」などの相対時間表記に変換する方法

SNSやブログのコメント欄などでよく見かける「10分前」「3時間前」といった相対的な時間表示。Webアプリケーションでは投稿日時をこのように表示することで、ユーザーにとって直感的で読みやすいインターフェースを実現できます。ここでは、PHPを使って指定されたタイムスタンプを「time ago(〜前)」形式に変換するプログラムを解説します。

サンプルコード

<?php
function to_time_ago( $time )
{
   $difference = time() - $time;
   if( $difference < 1 )
   {
      return 'less than only a second ago';
   }
   $time_rule = array (
      12 * 30 * 24 * 60 * 60 => 'year',
      30 * 24 * 60 * 60 => 'month',
      24 * 60 * 60 => 'day',
      60 * 60 => 'hour',
      60 => 'minute',
      1 => 'second'
   );
   foreach( $time_rule as $sec => $my_str )
   {
      $res = $difference / $sec;
      if( $res >= 1 )
      {
         $t = round( $res );
         return $t . ' ' . $my_str .
         ( $t > 1 ? 's' : '' ) . ' ago';
      }
   }
}
echo "The timestamp to time ago conversion is ";
echo to_time_ago( time() - 600);
?>

実行結果

The timestamp to time ago conversion is 10 minutes ago

コードの仕組み

まず、to_time_agoという関数を定義しています。この関数は、引数として渡されたタイムスタンプと現在時刻(time())の差分を計算します。差分が1秒未満だった場合は、「ほんの1秒ほど前に通過した」ことを示すメッセージを返して処理を終えます。

差分が1秒以上ある場合は、「年・月・日・時・分・秒」それぞれの単位に対応する秒数を連想配列として定義します。大きな単位から順番に格納するのがポイントです。これにより、後述のループ処理で最適な単位が優先的に判定されます。

続いて、foreachループでこの配列を先頭から順に走査します。各単位の秒数で差分を割り算し、結果が1以上になった時点で、その単位が該当していると判断できます。あとはround()で四捨五入して整数値を求め、「10 minutes ago」のような文字列を組み立てて返します。英語の複数形に対応するため、値が1より大きい場合にのみ「s」が付加されるようになっています。

日本語表示にカスタマイズするには

出力を日本語にしたい場合は、連想配列の文字列部分と戻り値の組み立て方を少し変更するだけで対応できます。

$time_rule = array (
   12 * 30 * 24 * 60 * 60 => '年前',
   30 * 24 * 60 * 60 => 'ヶ月前',
   24 * 60 * 60 => '日前',
   60 * 60 => '時間前',
   60 => '分前',
   1 => '秒前'
);
// 戻り値の部分
return $t . $my_str;

このように修正すれば、「10分前」のように自然な日本語で経過時間を表示できます。英語圏向けと日本語向けで出力を切り替えたい場合は、言語ごとに配列を用意しておくと管理がしやすくなります。

  1. PHP変数「11:00 AM」をMySQLの時間形式に変換する方法

    PHPの「11:00 AM」をMySQLの時間形式に変換する方法 MySQLのTIME型やDATETIME型は、時刻を24時間表記の「HH:MM:SS」形式で管理します。そのため、「11:00 AM」のようにAM/PMを含む文字列をデータベースに保存する場合は、事前に形式を変換しておく必要があります。本記事では、PHP標準のDateTimeクラスを使った変換方法を、サンプルコードと実行結果付きで解説します。 変換の基本の流れ DateTime::createFromFormat() … 入力文字列をDateTimeオブジェクトとして解析する format() … 解析結果を「H:i:s」(2

  2. 数値を英語の単語に変換するCプログラムの書き方

    数値で構成された文字列が与えられたとき、その数値を英語の単語(スペル表記)へ変換するのが本記事の課題です。例えば、入力が「361」であれば、出力は「Three hundred sixty one」となるようにします。この問題を解くためには、一の位・十の位・百の位・千の位など、それぞれの数字がどの桁に位置しているのかを意識することが重要です。なお、今回紹介するコードは最大4桁、つまり0から9999までの数値に対応しています。したがって、入力は0〜9999の範囲である必要があります。例として「1,111」を考えてみましょう。各桁は以下のように対応します。千の位:1(one thousand)百の位