diff --git a/lib/PHPExif/Hydrator/Mutator.php b/lib/PHPExif/Hydrator/Mutator.php index 164d57c..9c8a0d6 100644 --- a/lib/PHPExif/Hydrator/Mutator.php +++ b/lib/PHPExif/Hydrator/Mutator.php @@ -33,6 +33,7 @@ class Mutator implements HydratorInterface public function hydrate($object, array $data) { foreach ($data as $property => $value) { + $mutator = $this->determineMutator($property); if (method_exists($object, $mutator)) { diff --git a/lib/PHPExif/Mapper/Exiftool.php b/lib/PHPExif/Mapper/Exiftool.php index e77f504..85de8ea 100644 --- a/lib/PHPExif/Mapper/Exiftool.php +++ b/lib/PHPExif/Mapper/Exiftool.php @@ -136,7 +136,11 @@ public function mapRawData(array $data) $value = sprintf('%1$sm', $value); break; case self::CREATEDATE: - $value = DateTime::createFromFormat('Y:m:d H:i:s', $value); + try { + $value = new DateTime($value); + } catch (\Exception $exception) { + continue 2; + } break; case self::EXPOSURETIME: $value = '1/' . round(1 / $value); diff --git a/lib/PHPExif/Mapper/Native.php b/lib/PHPExif/Mapper/Native.php index be1c328..fdc483b 100644 --- a/lib/PHPExif/Mapper/Native.php +++ b/lib/PHPExif/Mapper/Native.php @@ -13,6 +13,7 @@ use PHPExif\Exif; use DateTime; +use Exception; /** * PHP Exif Native Mapper @@ -142,7 +143,11 @@ public function mapRawData(array $data) // manipulate the value if necessary switch ($field) { case self::DATETIMEORIGINAL: - $value = DateTime::createFromFormat('Y:m:d H:i:s', $value); + try { + $value = new DateTime($value); + } catch (Exception $exception) { + continue 2; + } break; case self::EXPOSURETIME: // normalize ExposureTime diff --git a/tests/PHPExif/Mapper/ExiftoolMapperTest.php b/tests/PHPExif/Mapper/ExiftoolMapperTest.php index 485cda8..5de1db1 100644 --- a/tests/PHPExif/Mapper/ExiftoolMapperTest.php +++ b/tests/PHPExif/Mapper/ExiftoolMapperTest.php @@ -236,4 +236,39 @@ public function testSetNumericInProperty() $this->assertEquals($expected, $reflProperty->getValue($this->mapper)); } + + public function testMapRawDataCorrectlyFormatsDifferentDateTimeString() + { + $rawData = array( + \PHPExif\Mapper\Exiftool::CREATEDATE => '2014-12-15 00:12:00' + ); + + $mapped = $this->mapper->mapRawData( + $rawData + ); + + $result = reset($mapped); + $this->assertInstanceOf('\DateTime', $result); + $this->assertEquals( + reset($rawData), + $result->format("Y-m-d H:i:s") + ); + } + + public function testMapRawDataCorrectlyIgnoresInvalidCreateDate() + { + $rawData = array( + \PHPExif\Mapper\Exiftool::CREATEDATE => 'Invalid Date String' + ); + + $result = $this->mapper->mapRawData( + $rawData + ); + + $this->assertCount(0, $result); + $this->assertNotEquals( + reset($rawData), + $result + ); + } } diff --git a/tests/PHPExif/Mapper/NativeMapperTest.php b/tests/PHPExif/Mapper/NativeMapperTest.php index d6e78fc..5f2e11c 100644 --- a/tests/PHPExif/Mapper/NativeMapperTest.php +++ b/tests/PHPExif/Mapper/NativeMapperTest.php @@ -187,4 +187,39 @@ public function testMapRawDataCorrectlyFormatsGPSData() $expected = '40.333452380952,-20.167314814815'; $this->assertEquals($expected, reset($result)); } + + public function testMapRawDataCorrectlyFormatsDifferentDateTimeString() + { + $rawData = array( + \PHPExif\Mapper\Native::DATETIMEORIGINAL => '2014-12-15 00:12:00' + ); + + $mapped = $this->mapper->mapRawData( + $rawData + ); + + $result = reset($mapped); + $this->assertInstanceOf('\DateTime', $result); + $this->assertEquals( + reset($rawData), + $result->format("Y-m-d H:i:s") + ); + } + + public function testMapRawDataCorrectlyIgnoresInvalidCreateDate() + { + $rawData = array( + \PHPExif\Mapper\Native::DATETIMEORIGINAL => 'Invalid Date String' + ); + + $result = $this->mapper->mapRawData( + $rawData + ); + + $this->assertCount(0, $result); + $this->assertNotEquals( + reset($rawData), + $result + ); + } }