1

基本的には、有効期限が切れるまでの残り時間を取得したいと考えています。以下のようにphp 5.3.xで簡単にやりました

$now = new DateTime();
$future_date =  new DateTime($enddate);
$interval = $future_date->diff($now,false); // ->diff will not work on 5.2.x
$interval->format("%d d, %h h, %i m");

PHPで何かを行うにはどうすればよいですか: 5.2.x(5.2.17)

私が試したこと:

new DateTime(date('Y-m-d H:i:s', $now->format('U') - $future_date->format('U')));

期待した結果が得られません。

4

3 に答える 3

3

DateIntervalPHP < 5.3 はこのクラスをサポートしていないためDateTime::diff()(これが正しい方法です) は使用できません。5.2.x で機能させるには、これを手動で行う必要があります。

計算は実際には非常に簡単です。

// Get the difference between the two dates, in seconds
$diff = $future_date->format('U') - $now->format('U');

// Calculate the days component
$d = floor($diff / 86400);
$diff %= 86400;

// Calculate the hours component
$h = floor($diff / 3600);
$diff %= 3600;

// Calculate the minutes component
$m = floor($diff / 60);

// Calculate the seconds component
$s = $diff % 60;

// $d, $h, $m and $s now contain the values you want, so you can just build a
// string from them
$str = "$d d, $h h, $m m, $s s";

ただし、うるう秒が考慮されていないため、より大きな間隔では不正確さが生じます。これは、数秒で終了する可能性があることを意味しますが、元のフォーマット文字列には秒のコンポーネントが含まれていないため、これはあなたがやっていることにとってあまり重要ではないと思います.

$nowから減算する必要があり$future_date、その逆ではないことにも注意してください。そうしないと、結果が負になります。

動いているのを見る

于 2012-12-10T10:42:13.830 に答える
1

私が試したことは機能しているようで、あなたが試したことからそれほど遠くありません:

echo $now = date('Y-m-d H:i:s');
echo PHP_EOL;
echo $future = date('Y-m-d H:i:s', strtotime('today + 3 days'));
echo PHP_EOL;
echo date('d', (strtotime("{$future}") - strtotime("{$now}")));

http://codepad.org/JbaJ3EGH を確認してください

そうすれば簡単にdate()変身できます。DateTimeまた、「3 日間隔」を日付にフォーマットすると「1970-01-01 00:00:00.000」の日付になるため、減算された日付から日、時間、分、または月のみを取得する必要があります...

于 2012-12-10T10:44:04.147 に答える
0

DaveRandom の非常に役立つ回答では、返される値floor()が float (double) であることを知っておくと役立つ場合があります。

$h === 1 ? true : false;

var_dump($h)が出力されても false を返します1

値が整数であることを確認する必要がある場合 (たとえば、時間単位の単数形および複数形の文字列を作成するときに、値が 1 以上であることを確認する必要がある場合)、割り当て時に整数としてキャストします。

$h = (int) floor($diff / 3600);

于 2013-11-17T01:47:41.747 に答える