たちは二番目を追加または減算する場合は、このコードを考えてみましょう:このタイムスタンプはちょうどDST(夏時間/サマータイム)内にあるようstrtotime()にバグがありますか?
date_default_timezone_set("Europe/Amsterdam");
$time = 1477789199;
echo $time . ' - ' . date('r', $time) . "\n";
// 1477789199 - Sun, 30 Oct 2016 02:59:59 +0200
をこれは、正しいです。
しかし、今のは、タイムスタンプの整数に1秒を追加してみましょう、と終了 DST:
$new = $time + 1;
echo $new . ' - ' . date('r', $new);
// 1477789200 - Sun, 30 Oct 2016 02:00:00 +0100
万歳! PHPはもう1秒後にはDSTがなく、適切な時間文字列を表示します。
しかし、どのような場合には、我々は、タイムスタンプの整数に秒を追加していないが、我々は二その1を追加するためにstrtotime()
を使用:
$new = strtotime('+1 second', $time);
echo $new . ' - ' . date('r', $new);
// 1477792800 - Sun, 30 Oct 2016 03:00:00 +0100
む〜!私たちはちょうど1秒ではなく1時間以上先行しました。 1秒、1時間、1日、または1年を追加しても、1時間余分に追加すると問題はありません。複数年を追加しても毎年DSTに入り、DSTを終了するため1時間余分になりますが、追加年数に関係なく1時間余分になります
しかし、一度は出口 10月のDSTと1秒を引いて、すべてがうまくいく...
しかし、もう一度。私たちが3月に入っていて、DSTに入ったばかりで、1秒を減算すると、まったく同じように観測されます。
待ち、何ですか?そう ... ?私に
echo strtotime('+ 1 second - 1 second', 1477789199); // echoes 1477792799
おっ
これはバグのように聞こえます。それとも、これは「設計」ですか?誰かがこれがどこかに書かれているのか、それとも報告する必要があるのかを知っていますか?テスト中
投稿前にPHPバグプールをチェックした場合、2012年に同様の問題がフォローアップなしで報告されていることがわかりました:https://bugs.php.net/bug.php?id=62185 –
[doc]( http://php.net/manual/en/function.strtotime.php): 'この関数を数学的演算に使用することはお勧めできません。 PHP 5.3以降ではDateTime :: add()とDateTime :: sub()、PHP 5.2ではDateTime :: modify()を使用する方がよいでしょう。 ' –
https://bugs.php.net/bug.php?id=73138 –