Skip to content

Commit

Permalink
[YAML] Fix processing timestamp with timezone
Browse files Browse the repository at this point in the history
Parse date strings containing timezone data correctly
Default date strings not containing timezone data to UTC
  • Loading branch information
noahheck authored and nicolas-grekas committed Nov 18, 2016
1 parent a43ccb1 commit 1b5b04a
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 3 deletions.
7 changes: 5 additions & 2 deletions src/Symfony/Component/Yaml/Inline.php
Expand Up @@ -606,8 +606,11 @@ private static function evaluateScalar($scalar, $flags, $references = array())
return (float) str_replace(',', '', $scalar);
case preg_match(self::getTimestampRegex(), $scalar):
if (Yaml::PARSE_DATETIME & $flags) {
$date = new \DateTime($scalar);
$date->setTimeZone(new \DateTimeZone('UTC'));
$utc = new \DateTimeZone('UTC');
// When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
$date = new \DateTime($scalar, $utc);
// Returned dates must have UTC timezone.
$date->setTimeZone($utc);

return $date;
}
Expand Down
6 changes: 5 additions & 1 deletion src/Symfony/Component/Yaml/Tests/InlineTest.php
Expand Up @@ -535,7 +535,11 @@ public function testParseNestedTimestampListAsDateTimeObject($yaml, $year, $mont
$expected = new \DateTime($yaml);
$expected->setTimeZone(new \DateTimeZone('UTC'));
$expected->setDate($year, $month, $day);
@$expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second));
if (PHP_VERSION_ID >= 70100) {
$expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second));
} else {
$expected->setTime($hour, $minute, $second);
}

$expectedNested = array('nested' => array($expected));
$yamlNested = "{nested: [$yaml]}";
Expand Down

0 comments on commit 1b5b04a

Please sign in to comment.