From c31670866972e0889ec622d726953476a5201502 Mon Sep 17 00:00:00 2001 From: Christian Flothmann Date: Fri, 26 Feb 2021 13:01:23 +0100 Subject: [PATCH] zero parts can be omitted in date interval input --- .../Serializer/Normalizer/DateIntervalNormalizer.php | 2 +- .../Tests/Normalizer/DateIntervalNormalizerTest.php | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Serializer/Normalizer/DateIntervalNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/DateIntervalNormalizer.php index 21abe49bb14db..74d43a74bda9b 100644 --- a/src/Symfony/Component/Serializer/Normalizer/DateIntervalNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/DateIntervalNormalizer.php @@ -105,7 +105,7 @@ public function denormalize($data, $type, $format = null, array $context = []) $dateIntervalFormat = substr($dateIntervalFormat, 2); break; } - $valuePattern = '/^'.$signPattern.preg_replace('/%([yYmMdDhHiIsSwW])(\w)/', '(?P<$1>\d+)$2', $dateIntervalFormat).'$/'; + $valuePattern = '/^'.$signPattern.preg_replace('/%([yYmMdDhHiIsSwW])(\w)/', '(?:(?P<$1>\d+)$2)?', preg_replace('/(T.*)$/', '($1)?', $dateIntervalFormat)).'$/'; if (!preg_match($valuePattern, $data)) { throw new UnexpectedValueException(sprintf('Value "%s" contains intervals not accepted by format "%s".', $data, $dateIntervalFormat)); } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/DateIntervalNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/DateIntervalNormalizerTest.php index beb1288e4470c..6badbb07dd0bd 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/DateIntervalNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/DateIntervalNormalizerTest.php @@ -124,6 +124,14 @@ public function testLegacyDenormalizeUsingFormatPassedInConstructor($format, $in $this->doTestDenormalizeUsingFormatPassedInConstructor($format, $input, $output, true); } + public function testDenormalizeIntervalsWithOmittedPartsBeingZero() + { + $normalizer = new DateIntervalNormalizer(); + + $this->assertDateIntervalEquals($this->getInterval('P3Y2M4DT0H0M0S'), $normalizer->denormalize('P3Y2M4D', \DateInterval::class)); + $this->assertDateIntervalEquals($this->getInterval('P0Y0M0DT12H34M0S'), $normalizer->denormalize('PT12H34M', \DateInterval::class)); + } + private function doTestDenormalizeUsingFormatPassedInConstructor($format, $input, $output, bool $legacy = false) { $normalizer = $legacy ? new DateIntervalNormalizer($format) : new DateIntervalNormalizer([DateIntervalNormalizer::FORMAT_KEY => $format]);