При создании объекта DateTime в строке со временем можно указывать часовой пояс (сдвиг в часах и минут от GMT), например
Если у нас есть две даты, которые находятся в разных часовых поясах, то иногда полезно посмотреть время одной даты в часовом поясе другой. Если обе даты были инициализированы способом, указанным выше (т.е. использую неименованные часовые пояса), то происходит ошибка «Can only do this for zones with ID for now».
Чтобы её обойти, делаем наследника DateTime
и с удовольстием его используем:
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')); }