8000 bug #45874 [HttpKernel]  Resolve DateTime values with default timezon… · symfony/symfony@1db1443 · GitHub
[go: up one dir, main page]

Skip to content

Commit 1db1443

Browse files
committed
bug #45874 [HttpKernel]  Resolve DateTime values with default timezone (GromNaN)
This PR was merged into the 6.1 branch. Discussion ---------- [HttpKernel]  Resolve DateTime values with default timezone | Q | A | ------------- | --- | Branch? | 6.1 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | #45865 (comment) | License | MIT | Doc PR | - Alternative to #45865 by Nicolas Grekas. Make sure the date input is parsed using the default timezone and the resulting `DateTimeInterface` instance has the default timezone. Except for timestamps, which are UTC by standard. Commits ------- 7d17928 Resolve DateTime values with default timezone
2 parents 9a14dd0 + 7d17928 commit 1db1443

File tree

2 files changed

+42
-11
lines changed

2 files changed

+42
-11
lines changed

src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/DateTimeValueResolver.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,15 @@ public function resolve(Request $request, ArgumentMetadata $argument): iterable
6262
if ($class::getLastErrors()['warning_count']) {
6363
$date = false;
6464
}
65-
} elseif (false !== filter_var($value, \FILTER_VALIDATE_INT, ['options' => ['min_range' => 0]])) {
66-
$date = new $class('@'.$value);
67-
} elseif (false !== $timestamp = strtotime($value)) {
68-
$date = new $class('@'.$timestamp);
65+
} else {
66+
if (false !== filter_var($value, \FILTER_VALIDATE_INT, ['options' => ['min_range' => 0]])) {
67+
$value = '@'.$value;
68+
}
69+
try {
70+
$date = new $class($value);
71+
} catch (\Exception $e) {
72+
$date = false;
73+
}
6974
}
7075

7176
if (!$date) {

src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolver/DateTimeValueResolverTest.php

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,16 @@ public function testFullDate(string $timezone)
6565
$resolver = new DateTimeValueResolver();
6666

6767
$argument = new ArgumentMetadata('dummy', \DateTime::class, false, false, null);
68-
$request = self::requestWithAttributes(['dummy' => '2012-07-21 00:00:00+0000']);
68+
$request = self::requestWithAttributes(['dummy' => '2012-07-21 00:00:00']);
6969

7070
/** @var \Generator $results */
7171
$results = $resolver->resolve($request, $argument);
7272
$results = iterator_to_array($results);
7373

7474
$this->assertCount(1, $results);
7575
$this->assertInstanceOf(\DateTime::class, $results[0]);
76-
$this->assertEquals('2012-07-21', $results[0]->format('Y-m-d'));
76+
$this->assertSame($timezone, $results[0]->getTimezone()->getName(), 'Default timezone');
77+
$this->assertEquals('2012-07-21 00:00:00', $results[0]->format('Y-m-d H:i:s'));
7778
}
7879

7980
/**
@@ -93,7 +94,8 @@ public function testUnixTimestamp(string $timezone)
9394

9495
$this->assertCount(1, $results);
9596
$this->assertInstanceOf(\DateTime::class, $results[0]);
96-
$this->assertEquals('2001-05-11', $results[0]->format('Y-m-d'));
97+
$this->assertSame('+00:00', $results[0]->getTimezone()->getName(), 'Timestamps are UTC');
98+
$this->assertEquals('2001-05-11 00:42:00', $results[0]->format('Y-m-d H:i:s'));
9799
}
98100

99101
public function testNullableWithEmptyAttribute()
@@ -125,7 +127,7 @@ public function testCustomClass()
125127

126128
$this->assertCount(1, $results);
127129
$this->assertInstanceOf(FooDateTime::class, $results[0]);
128-
$this->assertEquals('2016-09-08', $results[0]->format('Y-m-d'));
130+
$this->assertEquals('2016-09-08 00:00:00+00:00', $results[0]->format('Y-m-d H:i:sP'));
129131
}
130132

131133
/**
@@ -137,23 +139,47 @@ public function testDateTimeImmutable(string $timezone)
137139
$resolver = new DateTimeValueResolver();
138140

139141
$argument = new ArgumentMetadata('dummy', \DateTimeImmutable::class, false, false, null);
140-
$request = self::requestWithAttributes(['dummy' => '2016-09-08 00:00:00+0000']);
142+
$request = self::requestWithAttributes(['dummy' => '2016-09-08 00:00:00 +05:00']);
141143

142144
/** @var \Generator $results */
143145
$results = $resolver->resolve($request, $argument);
144146
$results = iterator_to_array($results);
145147

146148
$this->assertCount(1, $results);
147149
$this->assertInstanceOf(\DateTimeImmutable::class, $results[0]);
148-
$this->assertEquals('2016-09-08', $results[0]->format('Y-m-d'));
150+
$this->assertSame('+05:00', $results[0]->getTimezone()->getName(), 'Input timezone');
151+
$this->assertEquals('2016-09-08 00:00:00', $results[0]->format('Y-m-d H:i:s'));
152+
}
153+
154+
/**
155+
* @dataProvider getTimeZones
156+
*/
157+
public function testWithFormat(string $timezone)
158+
{
159+
date_default_timezone_set($timezone);
160+
$resolver = new DateTimeValueResolver();
161+
162+
$argument = new ArgumentMetadata('dummy', \DateTimeInterface::class, false, false, null, false, [
163+
MapDateTime::class => new MapDateTime('m-d-y H:i:s'),
164+
]);
165+
$request = self::requestWithAttributes(['dummy' => '09-08-16 12:34:56']);
166+
167+
/** @var \Generator $results */
168+
$results = $resolver->resolve($request, $argument);
169+
$results = iterator_to_array($results);
170+
171+
$this->assertCount(1, $results);
172+
$this->assertInstanceOf(\DateTimeImmutable::class, $results[0]);
173+
$this->assertSame($timezone, $results[0]->getTimezone()->getName(), 'Default timezone');
174+
$this->assertEquals('2016-09-08 12:34:56', $results[0]->format('Y-m-d H:i:s'));
149175
}
150176

151177
public function provideInvalidDates()
152178
{
153179
return [
154180
'invalid date' => [
155181
new ArgumentMetadata('dummy', \DateTime::class, false, false, null),
156-
self::requestWithAttributes(['dummy' => 'Invalid DateTime Format'])
182+
self::requestWithAttributes(['dummy' => 'Invalid DateTime Format']),
157183
],
158184
'invalid format' => [
159185
new ArgumentMetadata('dummy', \DateTime::class, false, false, null, false, [new MapDateTime(format: 'd.m.Y')]),

0 commit comments

Comments
 (0)
0