0

私は2つの DateTime を比較しています:

//Get the current DateTime
$date_now = new DateTime;
var_dump($date_now); // 2014-03-10 19:04:29

// I need to subtract 12 hours (I'm using $date_past to fetch $db_date in a request)
$date_past = $date_now->sub(new DateInterval("PT12H"));

// Get the DateTime from $db_date just fetched in database
$alert_date = new DateTime($db_date);
var_dump($alert_date); // 2014-03-10 17:04:00 in my test

// Get the difference
$diff = $alert_date->diff($date_now);
var_dump($diff->format("%H:%I:%S")); //09:59:31

したがって、09:59:31 と $diff->invert == 1 を取得します。これは、負の値であることを意味します。

私はこの問題を見ました:php datetime->diffは間違った時間数を計算しています(3が多すぎます)。同様の問題だと思いますが、->sub()を使い続けるための解決策が見つかりません。何か案は ?

TimeZone の問題である可能性があると思われる場合は、すべての DateTime を確認しましたが、すべての TimeZone が「Europe/Berlin」に設定されているため、ここから来たとは思いません。

ありがとうございました !

4

1 に答える 1

2

問題は、オブジェクトを変数に代入すると、参照によって代入されることです。だからあなたがするとき:

$date_past = $date_now->sub(new DateInterval("PT12H"));

変数$date_past$date_now両方がまったく同じ参照を指しており、一方を変更すると両方が変更されます。単純に変数をエコーアウトすると、これに気付くでしょう:

$date_now = new DateTime;
$date_past = $date_now->sub(new DateInterval("PT12H"));

echo $date_now->format('c'); // 2014-03-10T00:38:56-06:00
echo $date_past->format('c'); // 2014-03-10T00:38:56-06:00

両方がまったく同じものを印刷することに注目してください。通常、あなたがやりたいことは次を使用することですclone

$date_past = clone $date_now;
$date_past->sub(new DateInterval("PT12H"));

echo $date_now->format('c'); // 2014-03-10T12:41:20-06:00
echo $date_past->format('c'); // 2014-03-10T00:41:20-06:00
于 2014-03-10T18:35:45.750 に答える