5

シナリオ:データベースにレコードが入力されました。

私は次の方程式を理解しようとしています:

  1. レコードが追加されてからの時間数を取得する方法。
  2. レコードが追加されてから午前 0 時までの残り時間を取得する方法。

これらの時間を考えると:

  • 日時: 2012-08-22 20:11:20
  • タイムスタンプ: 1345684280
  • 真夜中 今夜: 2012-08-23 00:00:00
  • 真夜中のタイムスタンプ: 1345698000

私は正しい軌道に乗っているように感じます。計算を行うために適切な数学が必要ですか?私は数学が苦手です。ヘルプやガイダンスをいただければ幸いです。私は私のためにこれを完了するために誰かを探しているわけではありません。私が間違っていること、またはどうすればもっとうまくできるかについてのアドバイスを探しているだけです。私の目標を達成するために必要な数式を説明してください。

これが私がこれまでに持っているものです:

class tools{

    public function __construct(){
    }

    public function check_time($time, $request){
        $time = strtotime($time);
        if($request == 'since'){
            $theTime = time() - $time;
            $prefix = 'Since:';
        } elseif($request == 'until'){
            $midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y'));
            $theTime = $midnight - $time;
            $prefix = 'Until:'; 
        }

        $tokens = array (
            31536000 => 'year',
            2592000 => 'month',
            604800 => 'week',
            86400 => 'day',
            3600 => 'hour',
            60 => 'minute',
            1 => 'second'
        );

        foreach($tokens as $unit => $text){
            if($theTime < $unit) continue;
            $duration = floor($theTime / $unit);
            return $prefix.' '.$duration.' '.$text.(($duration>1)?'s':'');
        }
    }
}// EoF tools class

$tools = new tools();

print_r($tools->check_time('2012-08-22 20:11:20', 'since'));
print_r($tools->check_time('2012-08-22 20:11:20', 'until'));
4

5 に答える 5

10

ここでの解決策は非常に簡単です。すべての問題の原因となっている小さなエラーがあります。

あなたのコードでは、真夜中を計算するためにこれを持っています。

$midnight = mktime(0, 0, 0, date('n'), date('j'), date('Y'));

これは、TODAY の真夜中を使用しているという単純な事実では正しくありません (これは今日の 00:00 でしたが、今から何時間も前のことです。24 時間制で 00:00 と見なされ、明日であるため、真夜中の TOMORROW が必要です。正しいそれを行う方法は次のとおりです。

$midnight = strtotime("tomorrow 00:00:00");

strtotime() はすべて GMT に基づいていることに注意してください。そのため、ファイル/アプリケーションでデフォルトのタイムゾーンを設定してください。

私の答えが明確で、投稿したコードが間違っている理由と修正方法を説明していることを願っています.

于 2012-08-24T00:47:52.630 に答える
3

たぶん、このようなものですか?あなたが望む出力が何であるかを完全に理解していないことを認めなければなりません:

$d1 = new DateTime('2012-08-22 20:11:20');                                                                                          
$d2 = new DateTime('2012-08-23 00:00:00');

$interval = $d1->diff($d2);

echo $interval->format('%h hours %i minutes and %s seconds');
于 2012-08-23T16:01:18.097 に答える
0

真夜中は、時間を指定せずに翌日を超えてはなりません。これを行う最善の方法は次のとおりです。

<?php
$datetime1 = new DateTime(date('Y-m-d H:i:s'));//current datetime object
$datetime2 = new DateTime(date('Y-m-').date(d));//next day at midnight
$interval = $datetime1->diff($datetime2);//diference
echo $interval->format('H');printing only hours (same as date format)
?>

もっと知りたい場合:php date_diff

于 2012-08-23T16:07:42.680 に答える
-1

あなたはこれを試すことができます:

$now = strtotime('2012-08-22 20:11:20');
$midnight = strtotime('2012-08-23 00:00:00');
$difference = $midnight - $now;

echo date("H:i:s", $difference);
于 2012-08-23T15:58:17.613 に答える