web-dev-qa-db-ja.com

PHP 2つの日時の違いを見つける

2つの日付時刻の差を取得し、datetimeとして返そうとしています。 diffを使用した例を見つけましたが、正しく理解できないようです。

$timein = date("Y-m-d H:i:s");
$timeout = date("Y-m-d 20:00:00");
$totaltime = $timein->diff($timeout);

しかしながら $totaltimeログ0000-00-00 00:00:00私のDBに。これは、totaltime変数をフォーマットしていないためですか?

24
Staleyr

あなたの違いであなたが探しているフォーマットはわかりませんが、DateTimeを使用してそれを行う方法は次のとおりです

$datetime1 = new DateTime();
$datetime2 = new DateTime('2011-01-03 17:13:00');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds');
echo $elapsed;
58
John Conde

差分の計算には、単純に日時の差分と形式を使用できます。

<?php
$datetime1 = new DateTime('2009-10-11 12:12:00');
$datetime2 = new DateTime('2009-10-13 10:12:00');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%Y-%m-%d %H:%i:%s');
?>

OF DATETIME形式の詳細については、次を参照してください。 here
間隔の形式は自由に変更できます。

ここ は実例です

追伸これらの機能( diff() および format() )は、> = PHP 5.3.0でのみ動作します

4
Nishu Tayal

John Condeは自分の方法ですべての正しい手順を実行しますが、結果を仕様にフォーマットするという質問の最終ステップを満たしていません。

このコード( Demo )は、未加工の差分を表示し、未加工の差分をすぐにフォーマットしようとする問題を明らかにし、準備手順を表示して、最終的に正しくフォーマットされた結果:

$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00');  // change the millenium to see output difference
$diff = $datetime1->diff($datetime2);

// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: ",$diff->format('%y years %m months %d days %h hours %i minutes %s seconds'),"\n";

// Notice the impact when you change $datetime2's millenium from '1' to '2'
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n";  // only H does it right

$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));

echo '$detail array: ';
var_export($details);
echo "\n";

array_map(function($v,$k)
    use(&$r)
    {
        $r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT));
        if($k=='y' || $k=='m'){$r.="-";}
        elseif($k=='d'){$r.=" ";}
        elseif($k=='h' || $k=='i'){$r.=":";}
    },$details,array_keys($details)
);
echo "Valid format: ",$r; // now all components of datetime are properly padded

出力:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$detail array: array (
  'y' => 6,
  'm' => 3,
  'd' => 9,
  'h' => 1,
  'i' => 0,
  's' => 6,
)
Valid format: 0006-03-09 01:00:06

日時値の準備について説明します。

$detailsdiffオブジェクト を取り、配列としてキャストします。 array_flip(['y'、 'm'、 'd'、 'h'、 'i'、 's']) は、 array_intersect_key() を使用して、(array)$diffからすべての無関係なキーを削除するために使用されるキー。

次に、 array_map() を使用して、私のメソッドは各値と$detailsのキーを繰り返し、その左側を0で適切な長さまで埋め、$rを連結します(結果)要求された日時形式に準拠するために必要な区切り文字を含む文字列。

2
mickmackusa

申し訳ありませんが、以前の回答は間違っていました。 Ymd H:i:s形式の時間とタイムアウトの間の合計経過時間を取得しようとしている場合、DateTimeオブジェクトを使用してタイムアウトと時間の差分を取得し、 '%y-%m-%d%Hとしてフォーマットします。 %i:%s '。

0
user3189081