PHPについて質問です。


現在日にちの引き算をしたいと考えています。

PHP画面上で処理のボタンを押すと 今日の日付を変数に入れて

その変数とデータベースに入っている値を引き算するというものです。

例)

テーブル名:TABLE

項目名 DATETIME

項目DATETIMEの一行目に入っている値 2009-08-15 22:58:25

今日の日付 2008-08-13 22:57:24

表示したい値:後2日と1分と1秒です。

上記の場合どのようなスクリプトを組めばいいでしょうか?

自分でも一応作ってみたのですがエラーが出てしまったため、
わかるかたおりましたらご指摘いただければと考えております。

回答の条件
  • 1人2回まで
  • 登録:2009/08/13 16:36:56
  • 終了:2009/08/19 16:25:38

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/08/13 17:00:29

ポイント100pt

テーブルから取り出した日時を $d1 に、今日の日付を $d2 に代入したとします。

$d1 >= $d2 であるという前提です。

下記のようなスクリプトでできます。


なお、ご質問の「今日の日付」は2008年になっていました。下記ではそのままにしてあります。

<?php
$d1 = '2009-08-15 22:58:25';
$d2 = '2008-08-13 22:57:24';

//定数
define("SECMINUITE", 60);                   //1分(秒)
define("SECHOUR",    60 * 60);              //1時間(秒)
define("SECDAY",     60 * 60 * 24);         //1日(秒)
define("SECWEEK",    60 * 60 * 24 * 7);     //1週(秒)
define("SECMONTH",   60 * 60 * 24 * 30);    //1月(秒)
define("SECYEAR",    60 * 60 * 24 * 365);   //1年(秒)

$dt = strtotime($d1) - strtotime($d2);

$yy = (int)($dt / SECYEAR);
$dt -= $yy * SECYEAR;
$mm = (int)($dt / SECMONTH);
$dt -= $mm * SECYEAR;
$dd = (int)($dt / SECDAY);
$dt -= $dd * SECDAY;
$hh = (int)($dt / SECHOUR);
$dt -= $hh * SECHOUR;
$nn = (int)($dt / SECMINUITE);
$dt -= $nn * SECMINUITE;

if ($yy != 0)   echo $yy . '年';
if ($mm != 0)   echo $mm . '月';
if ($dd != 0)   echo $dd . '日';
if ($hh != 0)   echo $hh . '時';
if ($nn != 0)   echo $nn . '分';
if ($dt != 0)   echo $dt . '秒前';
?>
id:aiomock

ご回答ありがとうございます。

実行できました。

後大変申し訳ないのですが、引き算した値を秒数に変換して変数に格納するにはどのようにすればいいでしょうか?

その値を元に昇順、降順に出来れば並び替えたいと考えています。

2009/08/13 17:42:26

その他の回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/08/13 17:00:29ここでベストアンサー

ポイント100pt

テーブルから取り出した日時を $d1 に、今日の日付を $d2 に代入したとします。

$d1 >= $d2 であるという前提です。

下記のようなスクリプトでできます。


なお、ご質問の「今日の日付」は2008年になっていました。下記ではそのままにしてあります。

<?php
$d1 = '2009-08-15 22:58:25';
$d2 = '2008-08-13 22:57:24';

//定数
define("SECMINUITE", 60);                   //1分(秒)
define("SECHOUR",    60 * 60);              //1時間(秒)
define("SECDAY",     60 * 60 * 24);         //1日(秒)
define("SECWEEK",    60 * 60 * 24 * 7);     //1週(秒)
define("SECMONTH",   60 * 60 * 24 * 30);    //1月(秒)
define("SECYEAR",    60 * 60 * 24 * 365);   //1年(秒)

$dt = strtotime($d1) - strtotime($d2);

$yy = (int)($dt / SECYEAR);
$dt -= $yy * SECYEAR;
$mm = (int)($dt / SECMONTH);
$dt -= $mm * SECYEAR;
$dd = (int)($dt / SECDAY);
$dt -= $dd * SECDAY;
$hh = (int)($dt / SECHOUR);
$dt -= $hh * SECHOUR;
$nn = (int)($dt / SECMINUITE);
$dt -= $nn * SECMINUITE;

if ($yy != 0)   echo $yy . '年';
if ($mm != 0)   echo $mm . '月';
if ($dd != 0)   echo $dd . '日';
if ($hh != 0)   echo $hh . '時';
if ($nn != 0)   echo $nn . '分';
if ($dt != 0)   echo $dt . '秒前';
?>
id:aiomock

ご回答ありがとうございます。

実行できました。

後大変申し訳ないのですが、引き算した値を秒数に変換して変数に格納するにはどのようにすればいいでしょうか?

その値を元に昇順、降順に出来れば並び替えたいと考えています。

2009/08/13 17:42:26
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/08/13 18:49:39

ポイント35pt

計算も並び替えもMySQLの持っている機能を用いるほうが格段に効率が良いです。

(php側でプログラムを組むのは、面倒なだけでなく、処理時間も多くかかる場合もあります)

$day=Date("Y-m-d H:i:s");
$sqlstr = "
    SELECT *, TIMEDIFF('$day', `DATETIME`) AS a
    FROM TEST
    ORDER BY `DATETIME`
";
$sql=mysql_query($sqlstr);
while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {
     echo $row["a"];
}

逆順に並べたい場合は項目名にDESCをつけます。

    ORDER BY `DATETIME` DESC

あと何日と何時間何分という形への整形はpahoo氏の回答を参考にして付け加えてください。

id:aiomock

ご回答ありがとうございます。

2009/08/13 22:21:47
  • id:aiomock
    自分で作成したスクリプトは以下になります。


    //データベースへアクセス

    mysql_connect("aaaaaaa","bbbbbbbb","ccccccccc");
    mysql_query("SET NAMES SJIS");
    mysql_select_db("ddddddddddd");

    $sql=mysql_query("SELECT * FROM TEST");

    //今日の日にちを変数へ入れる。

    $day=Date("Y-m-d H:i:s");

    while ($row = mysql_fetch_array($sql, MYSQL_ASSOC)) {


    $start = new DateTime("".$day."");
    $end = new DateTime("".$row["DATETIME"]."");

    //引き算する。
    echo $start->diff($end,true)->format("%d日 %h時間 %i分 %s秒");

    }


    空白で表示されてしまいます。。。
  • id:aiomock
    すいません。

    今日の日付が

    2008-08-13 22:57:24

    になっていますが

    2009-08-13 22:57:24

    の間違いです。
  • id:pahoo
    > 引き算した値を秒数に変換して変数に格納するにはどのようにすればいいでしょうか?

    うーん、スクリプトを読んでもらえれば分かると思うのですが、
    $dt = strtotime($d1) - strtotime($d2);
    のところで、引き算した秒数を変数 $dt に代入しています。
    この後で、$dt に対してさらに引き算を行っているので、この時点で $dt を他の変数にコピーしておいてもらえればいいでしょう。
  • id:pahoo
    補足です。
    kn1967さんの回答ですが、戻り値は環境に依存するので、私が回答した変換方法では変換できないこともあります。
    また、項目名 DATETIME の型が DATETIME 型であるか、ないしはTEXT型で yyyy-mm-dd hh:mm:ss の書式で格納されていなければいけませんね。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません