Skip to content

Commit

Permalink
Merge pull request #14 from ivoba/master
Browse files Browse the repository at this point in the history
added fix for DateInterval and microseconds
  • Loading branch information
goetas committed Mar 3, 2020
2 parents 3fcd65c + 4b75028 commit 306d346
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 1 deletion.
17 changes: 16 additions & 1 deletion src/Jms/Handler/XmlSchemaDateHandler.php
Expand Up @@ -72,7 +72,7 @@ public function deserializeDateIntervalXml(XmlDeserializationVisitor $visitor, $
if (isset($attributes['nil'][0]) && (string) $attributes['nil'][0] === 'true') {
return null;
}
return new \DateInterval((string)$data);
return $this->createDateInterval((string)$data);
}

public function serializeDate(XmlSerializationVisitor $visitor, \DateTime $date, array $type, Context $context)
Expand Down Expand Up @@ -146,5 +146,20 @@ private function parseDateTime($data, array $type)

return $datetime;
}

private function createDateInterval($interval){
$f = 0.0;
if (preg_match('~\.\d+~',$interval,$match)) {
$interval = str_replace($match[0], "", $interval);
$f = (float)$match[0];
}
$di = new \DateInterval($interval);
// milliseconds are only available from >=7.1
if(isset($di->f)){
$di->f= $f;
}

return $di;
}
}

23 changes: 23 additions & 0 deletions tests/XmlSchemaDateHandlerDeserializationTest.php
Expand Up @@ -77,6 +77,29 @@ public function testDeserializeDate($date, \DateTime $expected)
$this->assertEquals($expected, $deserialized);
}

/**
* @dataProvider getDeserializeDateInterval
* @param string $dateInterval
* @param \DateTime $expected
*/
public function testDeserializeDateInterval($dateInterval, $expected)
{
$element = new \SimpleXMLElement("<DateInterval>$dateInterval</DateInterval>");
$deserialized = $this->handler->deserializeDateIntervalXml($this->visitor, $element, [], $this->context);
if (isset($deserialized->f)) {
$this->assertEquals($expected['f'], $deserialized->f);
}
$this->assertEquals($expected['s'], $deserialized->s);
}

public function getDeserializeDateInterval()
{
return [
['P0Y0M0DT3H5M7.520S', ['s' => 7, 'f' => 0.52]],
['P0Y0M0DT3H5M7S', ['s' => 7, 'f' => 0]]
];
}

public function getDeserializeDate()
{
return [
Expand Down

0 comments on commit 306d346

Please sign in to comment.