0

PHP(のみ)のシステム日付を変更することは可能ですか?デバッグ/テストの目的でこれが必要です。

//Test 1  (2010-01-01)
$datetime = new DateTime(); //(2010-01-01)

//Test 2  (2010-02-01)
$datetime = new DateTime(); //(2010-02-01)

他の開発者が同じシステムで作業しているため、実際のシステム クロックを実際に変更することはできません (私はできますが、それでも変更できます)。これが可能であること、または誰かが素晴らしいトリックを知っていることを願っています。

phpinfo(); を出力すると 次の行が表示されます。

Timezone Database   internal

多分それは「手動」のようなものに変更可能で、+120 のタイムゾーンを広告します

ありがとう!

4

2 に答える 2

3

これはカプセル化の問題のように思えます -- date() または time() のすべての言及を検索し、それらを $site->getDisplayedDate() などのコードに適切なものに置き換えてみませんか?

私はあなたの痛みを感じますが、これを行う方法はないと思います. このように考えてみてください... 無関係なコードで time() を呼び出し、3 週間先の日付が表示されたらどう思いますか?

タイムゾーンのみを変更できます(もちろん、数時間だけ前後します。丸一日進むことはできません)が、それは正しい解決策ではありません...

于 2013-10-24T13:07:24.413 に答える
2

デフォルトを拡張する独自のDateTimeクラスを作成してDateTime、動作を変更できます。

<?php
    class CustomDateTimeVariables {
        public static $date = 'now';
    }

    class CustomDateTime extends DateTime {
        public function __construct($time = null, DateTimeZone $timezone = null) {
            if ($time === null) {   
                $time = CustomDateTimeVariables::$date;
            }
            if ($timezone !== null) {
                parent::__construct($time, $timezone);
            } else {
                parent::__construct($time);
            }
        }
    }

    CustomDateTimeVariables::$date = '2010-01-01';
    $datetime1 = new CustomDateTime();

    CustomDateTimeVariables::$date = '2010-01-02';
    $datetime2 = new CustomDateTime();

    var_dump($datetime1->Format('Y-m-d H:i:s')); //"2010-01-01 00:00:00"
    var_dump($datetime2->Format('Y-m-d H:i:s')); //"2010-01-02 00:00:00"
?>

デモ

このようにして、デフォルトの時間を非常に簡単に設定することもできます (チェックしてくださいCustomDateTimeVariables):

<?php
    class CustomDateTimeVariables {
        public static $date = 'now +120 hours';
    }

    class CustomDateTime extends DateTime {
        public function __construct($time = null, DateTimeZone $timezone = null) {
            if ($time === null) {   
                $time = CustomDateTimeVariables::$date;
            }
            if ($timezone !== null) {
                parent::__construct($time, $timezone);
            } else {
                parent::__construct($time);
            }
        }
    }

    $datetime = new CustomDateTime();

    var_dump($datetime->Format('Y-m-d H:i:s')); //"2013-10-29 13:37:39"
?>

..ライブになったら、デフォルトを に戻すだけですnow

于 2013-10-24T13:34:42.547 に答える