@DASPRiD  What about this way?
For hydration:

    public function hydrate($value)
    {
        if ($value === '' || $value === null) {
            return null;
        }

        return DateTime::createFromFormat($this->format, $value, $this->hydrateTimeZone);
    }

For extraction:

    public function extract($value)
    {
        if ($value instanceof DateTime) {
            $value->setTimezone($this->extractTimeZone);
            return $value->format($this->format);
        }

        return $value;
    }