diff --git a/src/Strategy/DateTimeFormatterStrategy.php b/src/Strategy/DateTimeFormatterStrategy.php index c106993..8903a17 100644 --- a/src/Strategy/DateTimeFormatterStrategy.php +++ b/src/Strategy/DateTimeFormatterStrategy.php @@ -25,16 +25,23 @@ final class DateTimeFormatterStrategy implements StrategyInterface */ private $timezone; + /** + * @var bool + */ + private $dateTimeFallback; + /** * Constructor * * @param string $format * @param DateTimeZone|null $timezone + * @param bool $dateTimeFallback */ - public function __construct($format = DateTime::RFC3339, DateTimeZone $timezone = null) + public function __construct($format = DateTime::RFC3339, DateTimeZone $timezone = null, $dateTimeFallback = false) { $this->format = (string) $format; $this->timezone = $timezone; + $this->dateTimeFallback = (bool) $dateTimeFallback; } /** @@ -42,8 +49,7 @@ public function __construct($format = DateTime::RFC3339, DateTimeZone $timezone * * Converts to date time string * - * @param mixed|DateTime $value - * + * @param mixed|DateTimeInterface $value * @return mixed|string */ public function extract($value) @@ -61,8 +67,7 @@ public function extract($value) * {@inheritDoc} * * @param mixed|string $value - * - * @return mixed|DateTime + * @return mixed|DateTimeInterface */ public function hydrate($value) { @@ -76,6 +81,10 @@ public function hydrate($value) $hydrated = DateTime::createFromFormat($this->format, $value); } + if ($hydrated === false && $this->dateTimeFallback) { + $hydrated = new DateTime($value, $this->timezone); + } + return $hydrated ?: $value; } } diff --git a/test/Strategy/DateTimeFormatterStrategyTest.php b/test/Strategy/DateTimeFormatterStrategyTest.php index 2fadc8c..52cb087 100644 --- a/test/Strategy/DateTimeFormatterStrategyTest.php +++ b/test/Strategy/DateTimeFormatterStrategyTest.php @@ -100,4 +100,17 @@ public function testCanExtractAnyDateTimeInterface() $strategy->extract($dateMock); $strategy->extract($dateImmutableMock); } + + public function testCanHydrateWithDateTimeFallback() + { + $strategy = new DateTimeFormatterStrategy('Y-m-d', null, true); + $date = $strategy->hydrate('2018-09-06T12:10:30'); + + $this->assertSame('2018-09-06', $date->format('Y-m-d')); + + $strategy = new DateTimeFormatterStrategy('Y-m-d', new \DateTimeZone('Europe/Prague'), true); + $date = $strategy->hydrate('2018-09-06T12:10:30'); + + $this->assertSame('Europe/Prague', $date->getTimezone()->getName()); + } }