Pull to refresh

Перевод даты в неименованный часовой пояс

Reading time 1 min
Views 1.2K
При создании объекта DateTime в строке со временем можно указывать часовой пояс (сдвиг в часах и минут от GMT), например

new DateTime('2009-09-30 12:00:00+0400');


Если у нас есть две даты, которые находятся в разных часовых поясах, то иногда полезно посмотреть время одной даты в часовом поясе другой. Если обе даты были инициализированы способом, указанным выше (т.е. использую неименованные часовые пояса), то происходит ошибка «Can only do this for zones with ID for now».

Чтобы её обойти, делаем наследника DateTime

class CustomDateTime extends DateTime {
 
    public function setTimezone($dtz) {
        if (!preg_match('/^[0-9\+\-]/', $dtz->getName())) {
            return parent::setTimezone($dtz);
        }
 
        $offset = $dtz->getOffset($this) - $this->getTimezone()->getOffset($this);
 
        $this->modify($offset . ' second');
 
        $format = $this->format('Y-m-d H:i:s') . $dtz->getName();
        $this->__construct($format);
    }
}


и с удовольстием его используем:

    public function testApplyUnnamedTimezoneToOtherDateTime() {
        $dt1 = new CustomDateTime('2009-09-30T12:00:00-02:00');
        $dt2 = new CustomDateTime('2009-09-30T12:00:00+02:00');
 
        $dt2->setTimezone($dt1->getTimezone());

        $this->assertEquals('2009-09-30T08:00:00-02:00', $dt2->format('c'));
    }
Tags:
Hubs:
+6
Comments 0
Comments Leave a comment

Articles