diff --git a/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php index f48745031e8b7..5fab3d8a55d6d 100644 --- a/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/DateTimeNormalizer.php @@ -113,6 +113,16 @@ public function denormalize($data, $type, $format = null, array $context = []) throw new NotNormalizableValueException(sprintf('Parsing datetime string "%s" using format "%s" resulted in %d errors: ', $data, $dateTimeFormat, $dateTimeErrors['error_count'])."\n".implode("\n", $this->formatDateTimeErrors($dateTimeErrors['errors']))); } + $defaultDateTimeFormat = $this->defaultContext[self::FORMAT_KEY] ?? null; + + if (null !== $defaultDateTimeFormat) { + $object = \DateTime::class === $type ? \DateTime::createFromFormat($defaultDateTimeFormat, $data, $timezone) : \DateTimeImmutable::createFromFormat($defaultDateTimeFormat, $data, $timezone); + + if (false !== $object) { + return $object; + } + } + try { return \DateTime::class === $type ? new \DateTime($data, $timezone) : new \DateTimeImmutable($data, $timezone); } catch (\Exception $e) { diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php index 51fc17d85afea..ca740a4d7e89e 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/DateTimeNormalizerTest.php @@ -305,6 +305,28 @@ public function testDenormalizeDateTimeStringWithSpacesUsingFormatPassedInContex $this->normalizer->denormalize(' 2016.01.01 ', \DateTime::class, null, [DateTimeNormalizer::FORMAT_KEY => 'Y.m.d|']); } + public function testDenormalizeDateTimeStringWithDefaultContextFormat() + { + $format = 'd/m/Y'; + $string = '01/10/2018'; + + $normalizer = new DateTimeNormalizer([DateTimeNormalizer::FORMAT_KEY => $format]); + $denormalizedDate = $normalizer->denormalize($string, \DateTimeInterface::class); + + $this->assertSame('01/10/2018', $denormalizedDate->format($format)); + } + + public function testDenormalizeDateTimeStringWithDefaultContextAllowsErrorFormat() + { + $format = 'd/m/Y'; // the default format + $string = '2020-01-01'; // the value which is in the wrong format, but is accepted because of `new \DateTime` in DateTimeNormalizer::denormalize + + $normalizer = new DateTimeNormalizer([DateTimeNormalizer::FORMAT_KEY => $format]); + $denormalizedDate = $normalizer->denormalize($string, \DateTimeInterface::class); + + $this->assertSame('2020-01-01', $denormalizedDate->format('Y-m-d')); + } + public function testDenormalizeFormatMismatchThrowsException() { $this->expectException(UnexpectedValueException::class); pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy