Skip to content

Commit 5cf600d

Browse files
committed
bug symfony#21218 [Form] DateTimeToLocalizedStringTransformer does not use timezone when using date only (magnetik)
This PR was merged into the 2.7 branch. Discussion ---------- [Form] DateTimeToLocalizedStringTransformer does not use timezone when using date only | Q | A | ------------- | --- | Branch? | 2.7 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | symfony#21217 | License | MIT The `DateTimeToLocalizedStringTransformer` when used with a pattern that have only date (in `DateType` for instance) does not convert the result in the desired output Reproduction steps: - Use `DateType` in a form - Set the `model_timezone` to `Pacific/Tahiti`, having default timezone to `Europe/Berlin`. - Enter the date `2017-01-10` - Submit the form - Notice that the received data is `2017-01-10 00:00 Europe/Berlin`, whereas it should be `2017-01-10 11:00 Europe/Berlin` Commits ------- 031d8c2 [Form] DateTimeToLocalizedStringTransformer does not use TZ when using only date
2 parents d7bc68a + 031d8c2 commit 5cf600d

File tree

2 files changed

+13
-4
lines changed

2 files changed

+13
-4
lines changed

src/Symfony/Component/Form/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformer.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,11 @@ public function reverseTransform($value)
130130
try {
131131
if ($dateOnly) {
132132
// we only care about year-month-date, which has been delivered as a timestamp pointing to UTC midnight
133-
return new \DateTime(gmdate('Y-m-d', $timestamp), new \DateTimeZone($this->inputTimezone));
133+
$dateTime = new \DateTime(gmdate('Y-m-d', $timestamp), new \DateTimeZone($this->outputTimezone));
134+
} else {
135+
// read timestamp into DateTime object - the formatter delivers a timestamp
136+
$dateTime = new \DateTime(sprintf('@%s', $timestamp));
134137
}
135-
136-
// read timestamp into DateTime object - the formatter delivers a timestamp
137-
$dateTime = new \DateTime(sprintf('@%s', $timestamp));
138138
// set timezone separately, as it would be ignored if set via the constructor,
139139
// see http://php.net/manual/en/datetime.construct.php
140140
$dateTime->setTimezone(new \DateTimeZone($this->outputTimezone));

src/Symfony/Component/Form/Tests/Extension/Core/DataTransformer/DateTimeToLocalizedStringTransformerTest.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,15 @@ public function testReverseTransformWithDifferentTimezones()
240240
$this->assertDateTimeEquals($dateTime, $transformer->reverseTransform('03.02.2010, 04:05'));
241241
}
242242

243+
public function testReverseTransformOnlyDateWithDifferentTimezones()
244+
{
245+
$transformer = new DateTimeToLocalizedStringTransformer('Europe/Berlin', 'Pacific/Tahiti', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, \IntlDateFormatter::GREGORIAN, 'yyyy-MM-dd');
246+
247+
$dateTime = new \DateTime('2017-01-10 11:00', new \DateTimeZone('Europe/Berlin'));
248+
249+
$this->assertDateTimeEquals($dateTime, $transformer->reverseTransform('2017-01-10'));
250+
}
251+
243252
public function testReverseTransformWithDifferentPatterns()
244253
{
245254
$transformer = new DateTimeToLocalizedStringTransformer('UTC', 'UTC', \IntlDateFormatter::FULL, \IntlDateFormatter::FULL, \IntlDateFormatter::GREGORIAN, 'MM*yyyy*dd HH|mm|ss');

0 commit comments

Comments
 (0)