使用设置的时区扩展DateTime对象

时间:2010-12-24 00:28:00

标签: php design-patterns datetime

我在用什么模式来完成这个

时遇到了麻烦
class DateTimeReference {
    function __construct($time) {
        $this = new DateTime($time, new DateTimeZone("UTC"));

    }
}

$date = new DateTime("now");                // in server time
$dateref = new DateTimeReference("now");    // in UTC

基本上我想创建DateTime对象的“扩展名”,但设置时区。当然,这是一个错误,因为您无法重新分配$this。我不想使用工厂对象 - 任何人都可以向我推荐我如何处理这个问题(或者使用什么模式,例如?)。可能是装饰者模式?

3 个答案:

答案 0 :(得分:5)

我不知道这是否符合你想要使用的模式,但它应该有用。

class DateTimeReference extends DateTime {
    function __construct(string $time = "now" , DateTimeZone $timezone = NULL ) {
        parent::__construct($time, new DateTimeZone("UTC"));
    }
}

或者如果您希望用户能够覆盖时区,但如果未设置则默认为UTC:

class DateTimeReference extends DateTime {
    function __construct(string $time = "now" , DateTimeZone $timezone = NULL ) {
        parent::__construct($time,  is_null($timezone) ?  new DateTimeZone("UTC") : $timezone );
    }
}

答案 1 :(得分:3)

你能做到:

date_default_timezone_set('UTC');

取决于你的应用程序做了什么,但如果你能做到这一点,这是最简单的: - )

答案 2 :(得分:2)

我没有看到这样做的问题..

class DateTimeReference extends DateTime {
    function __construct($time, $timezone) {
        parent::__construct($time);
        $this->setTimeZone(new DateTimeZone($timezone));
    }
}

$dateref = new DateTimeReference("now", "America/New_York");

您还可以通过以下方式选择时区:

class DateTimeReference extends DateTime {
    function __construct($time, $timezone = "America/New_York") {
        parent::__construct($time);
        $this->setTimeZone(new DateTimeZone($timezone));
    }
}

$dateref = new DateTimeReference("now");

此外,您只需将新的DateTimeZone对象传递给DateTime的构造函数:

$dateref = new DateTime("now", new DateTimeZone("America/New_York"));

请参阅示例部分:http://www.php.net/manual/en/datetime.construct.php