Расширение объекта DateTime с установленным часовым поясом - PullRequest
2 голосов
/ 24 декабря 2010

У меня проблемы с тем, какой шаблон я должен использовать для достижения этой цели

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 ]

5 голосов
/ 24 декабря 2010

Я не знаю, подойдет ли это шаблонам, которые вы хотите использовать, но это должно работать.

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 );
    }
}
4 голосов
/ 24 декабря 2010

Можете ли вы просто сделать:

date_default_timezone_set('UTC');

Зависит от того, что еще делает ваше приложение, но если вы можете сделать это, это самое простое: -)

2 голосов
/ 24 декабря 2010

Я не вижу проблем с этим ..

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...