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 cdb11a7
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 11 deletions.
6 changes: 2 additions & 4 deletions src/Symfony/Component/Yaml/Inline.php
Expand Up @@ -606,10 +606,8 @@ 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'));

return $date;
// When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
return new \DateTime($scalar, new \DateTimeZone('UTC'));
}

$timeZone = date_default_timezone_get();
Expand Down
20 changes: 13 additions & 7 deletions src/Symfony/Component/Yaml/Tests/InlineTest.php
Expand Up @@ -502,7 +502,7 @@ public function testParseTimestampAsUnixTimestampByDefault($yaml, $year, $month,
/**
* @dataProvider getTimestampTests
*/
public function testParseTimestampAsDateTimeObject($yaml, $year, $month, $day, $hour, $minute, $second)
public function testParseTimestampAsDateTimeObject($yaml, $year, $month, $day, $hour, $minute, $second, $timezone)
{
$expected = new \DateTime($yaml);
$expected->setTimeZone(new \DateTimeZone('UTC'));
Expand All @@ -514,16 +514,18 @@ public function testParseTimestampAsDateTimeObject($yaml, $year, $month, $day, $
$expected->setTime($hour, $minute, $second);
}

$this->assertEquals($expected, Inline::parse($yaml, Yaml::PARSE_DATETIME));
$date = Inline::parse($yaml, Yaml::PARSE_DATETIME);
$this->assertEquals($expected, $date);
$this->assertSame($timezone, $date->format('O'));
}

public function getTimestampTests()
{
return array(
'canonical' => array('2001-12-15T02:59:43.1Z', 2001, 12, 15, 2, 59, 43.1),
'ISO-8601' => array('2001-12-15t21:59:43.10-05:00', 2001, 12, 16, 2, 59, 43.1),
'spaced' => array('2001-12-15 21:59:43.10 -5', 2001, 12, 16, 2, 59, 43.1),
'date' => array('2001-12-15', 2001, 12, 15, 0, 0, 0),
'canonical' => array('2001-12-15T02:59:43.1Z', 2001, 12, 15, 2, 59, 43.1, '+0000'),
'ISO-8601' => array('2001-12-15t21:59:43.10-05:00', 2001, 12, 16, 2, 59, 43.1, '-0500'),
'spaced' => array('2001-12-15 21:59:43.10 -5', 2001, 12, 16, 2, 59, 43.1, '-0500'),
'date' => array('2001-12-15', 2001, 12, 15, 0, 0, 0, '+0000'),
);
}

Expand All @@ -535,7 +537,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 cdb11a7

Please sign in to comment.