2016-04-01 10 views
6

私は日時の「SETDATE」方法の奇妙な行動を持っているので、私は、サーバーやPHPのいずれかの可能性のある設定ミスを探すために少しの助けを必要とする:奇妙な日時:: SETDATE()の挙動

$datetime = new DateTime('2016-01-01 23:59:59'); 
$datetime->setDate(2016, 2, 28); 
print_r($datetime); 

/* 
DateTime Object 
(
    [date] => 2016-01-28 23:59:59 
    [timezone_type] => 3 
    [timezone] => Europe/Berlin 
) 
date should actually be february! 
*/ 

まあ、私は3月に日付を設定すると結果は2月2日になるので、少なくとも一貫しています。 PHPのデフォルトのタイムゾーンで

$datetime = new DateTime('2016-01-01 23:59:59'); 
$datetime->setDate(2016, 3, 28); 
print_r($datetime); 

/* 
DateTime Object 
(
    [date] => 2016-02-28 23:59:59 
    [timezone_type] => 3 
    [timezone] => Europe/Berlin 
) 
date should actually be march! 
*/ 

// "Europe/Berlin" 
echo date_default_timezone_get(); 

に設定されているサーバーが現在

php version 5.3.2 (unfortunately i cannot upgrade) 

で実行されているサーバーの時刻を正確に設定し、タイムゾーンもヨーロッパ/ベルリンです。

誰かが私に何か助けてもらえますか助言してくれますか?

+2

は、私が最初にそれがあまりにもスマートいるPHPの日付関数によって引き起こささらに別のDSLの質問だと思ったが、その後、私はあなたのコードを試してみましたが、私は単に[問題を再現することはできません全く](https://で3v4l .org/Ne2qi)。これは100%の実コードですか?あなたのシステム仕様は何ですか? –

+0

申し訳ありませんが、私はいつもサポートされていないバージョン*ボタンを忘れています。 [更新されたデモ](https://3v4l.org/nPsle)を確認してください。私が考えることができるのは、あなたの内部の日付データベースが壊れているか何かがあるということだけです。 –

+0

返事をありがとう。これは実際にそのサーバー上で起こります(いくつかの仮想テストマシンでは完璧に動作します)。あなたは、内部の日付データベースをチェックする方法を知っていますか? – Ryo

答えて

1

奇妙な動作として、私は奇妙な回避策を見つけました。私は思って、他の人がこのエラーを出さないように願っています(質問への回答を参照)。ちょうどの場合:

DateTime-Classを変数に再インスタンス化する必要があります。なぜ私に尋ねないでください! F - 、 -

$datetime = new DateTime(); 
$datetime = new DateTime('2016-01-01 23:59:59'); 

$datetime->setDate(2016, 2, 28); 
print_r($datetime); 

/* 
DateTime Object 
(
    [date] => 2016-02-28 23:59:59 
    [timezone_type] => 3 
    [timezone] => Europe/Berlin 
) 
*/